두개의 백터 v1과 v2가 있다고 할때, v1의 내용을 v2의 뒤쪽 반과 같이 하는 가장 간단한 방법은
v1.assign(v2.begin()+v2.size()/2, v.end()); |
이다.
물론 루프를 사용할수도 있으며 copy 알고리즘과 back_insert 삽입연산자를 사용할수도 있다. 하지만 가능하다면 이경우는 vector에서 제공하는 멤버함수를 사용하는것이 좋다.
다른 예로 int 배열을 vector의 앞쪽에 복사할 경우
의 코드를 사용하게 되는데 이것을 copy 알고리즘을 이용해서 구현하면
같은 코드로 구성이 된다. 하지만 copy와 삽입연산자를 사용할 경우
물론 루프를 사용할수도 있으며 copy 알고리즘과 back_insert 삽입연산자를 사용할수도 있다. 하지만 가능하다면 이경우는 vector에서 제공하는 멤버함수를 사용하는것이 좋다.
- 범위멤버함수를 사용한 코드가 대개 짧다.
- 범위멤버함수는 훨씬 명확하고 간결한 의미를 전달한다.
다른 예로 int 배열을 vector의 앞쪽에 복사할 경우
int data[numValues];
vector<int> v;
…
v.insert(v.begin(), data, data + numValues);
copy(data, data + numValues, inserter(v, v.begin()));
- numValues 번에 해당하는 insert 함수의 호출하는 비용
- 앞쪽에다가 삽입함으로써 insert 호출시마다 vector를 뒤로 밀어버리는 비용
- 삽입시 컨테이너가 모자를 경우 생기는 메모리 할당 비용
이런 문제는 vector 보다는 적지만 list 에서도 마찬가지 이다. list에 insert 를 호출시 삽입되는 위치의 앞과 뒤에 있는 노드의 서로를 연결시키는 포인터값을 수정해야 하며 이것 역시 추가적인 비용이 들어간다. 범위 insert를 호출한다면 위의 비용은 한번으로 줄어들 것이다.
정리
|