더북(TheBook)

예제 코드에서 볼 수 있듯이 push_back() 함수는 벡터의 맨 뒤에 원소를 추가합니다. insert() 함수는 원소를 삽입할 위치를 반복자 타입의 인자로 받습니다. 그러므로 insert()begin() 함수를 함께 사용하여 벡터 맨 앞에 새로운 원소를 삽입할 수 있습니다.

이번에는 push_back() 또는 insert() 함수와 비교하여 좀 더 효율적인 원소 추가 방법에 대해 알아보겠습니다. push_back() 또는 insert() 함수의 단점 중 하나는 이들 함수가 추가할 원소를 먼저 임시로 생성한 후, 벡터 버퍼 내부 위치로 복사 또는 이동을 수행한다는 점입니다. 이러한 단점은 새로운 원소가 추가될 위치에서 해당 원소를 생성하는 방식으로 최적화할 수 있으며, 이러한 기능이 emplace_back() 또는 emplace() 함수에 구현되어 있습니다. 그러므로 push_back() 또는 insert() 같은 일반적인 삽입 함수 대신 emplace_back() 또는 emplace() 함수를 사용하는 것이 성능 향상에 도움이 됩니다. 이 경우 새 원소 위치에서 곧바로 객체가 생성되기 때문에 이들 함수 인자에 생성된 객체를 전달하는 것이 아니라 생성자에 필요한 매개변수를 전달해야 합니다. 그러면 emplace_back() 또는 emplace() 함수가 전달된 생성자 인자를 적절하게 사용하여 객체를 생성하고 삽입합니다.

std::vector는 원소 제거를 위해 pop_back()erase() 함수를 제공합니다. pop_back() 함수는 벡터에서 맨 마지막 원소를 제거하며, 그 결과 벡터 크기는 1만큼 줄어듭니다. erase() 함수는 두 가지 형태로 오버로딩되어 있습니다. 한 가지 형태는 반복자 하나를 인자로 받아 해당 위치 원소를 제거하고, 다른 형태는 범위의 시작과 끝을 나타내는 반복자를 받아 시작부터 끝 바로 앞 원소까지 제거합니다. 즉, 시작 위치 원소는 제거되지만 끝 위치 원소는 제거되지 않습니다. C++ 표준에서는 이들 함수 동작 시 벡터의 용량이 감소할 필요가 없지만, 컴파일러 구현에 따라 달라질 수 있습니다. pop_back() 함수는 남아 있는 위치를 조정할 필요가 없으므로 매우 빠르게 동작하고, 시간 복잡도는 O(1)입니다. 그러나 erase() 함수는 특정 위치 원소를 삭제한 후, 뒤쪽의 원소들을 모두 앞으로 이동해야 하기 때문에 O(n)의 시간이 소요됩니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.