C++ STL insert와 erase 완전정복, 반복자 기반 삽입과 삭제 이해하기
📌 STL 컨테이너를 자유자재로 다루고 싶다면 insert와 erase 메서드를 반드시 알아야 합니다
안녕하세요.
C++로 프로그래밍을 하다 보면 STL(Standard Template Library)의 컨테이너를 다루는 일이 정말 많죠.
그중에서도 insert()와 erase() 함수는 거의 모든 컨테이너에서 사용되며, 자료 구조를 조작하는 데 핵심적인 역할을 합니다.
처음 C++ STL을 접했을 때는 문법이 조금 어렵게 느껴질 수 있지만, 이 두 가지 함수의 동작 원리와 사용 방법만 잘 익혀도 다양한 문제를 효과적으로 해결할 수 있어요.
오늘은 이 두 함수를 중심으로 반복자와 함께 쓰는 고급 활용법까지 자세히 설명드릴게요.
함수의 기본 구조는 물론, vector, list, map 등 컨테이너별 사용 예시까지 실제 코드 중심으로 정리해봤습니다.
이 글을 통해 여러분은 C++ STL 컨테이너에서 insert와 erase가 어떻게 작동하는지를 정확하게 이해하게 될 거예요.
단순히 요소를 넣고 지우는 수준을 넘어서, 반복자(iterator) 기반의 정밀한 위치 제어, 시간 복잡도 차이, 컨테이너별 특성에 따른 최적 사용법까지 모두 다룰 예정입니다.
C++ STL을 좀 더 자유자재로 활용하고 싶은 분이라면 꼭 끝까지 읽어주세요.
📋 목차
🧩 insert() 함수의 기본 개념과 사용법
C++ STL에서 insert() 함수는 컨테이너에 새로운 요소를 삽입할 때 사용하는 핵심 메서드입니다.
vector, list, set, map 등 거의 모든 컨테이너에서 지원되며, 반복자(iterator) 위치를 기준으로 요소를 삽입할 수 있다는 점이 큰 특징이에요.
기본적인 형태는 다음과 같습니다.
std::vector<int> v = {1, 2, 4};
v.insert(v.begin() + 2, 3); // 결과: {1, 2, 3, 4}
위 코드에서 v.begin() + 2는 세 번째 위치를 가리키며, 여기에 3이 삽입됩니다.
이처럼 insert는 반복자 위치를 지정해야 한다는 점에서 유연하면서도 정확한 삽입이 가능하죠.
컨테이너별 특징도 기억해두면 좋아요.
예를 들어, vector는 중간에 삽입할 경우 모든 요소를 한 칸씩 뒤로 밀기 때문에 O(n)의 시간이 걸리는 반면, list는 포인터만 수정하면 되기 때문에 O(1)에 가까운 성능을 보여줍니다.
💎 핵심 포인트:
insert()는 반복자를 이용해 정확한 위치 제어가 가능하며, 컨테이너 종류에 따라 성능 차이가 발생합니다.
- ➕vector.insert()는 위치 지정 필수, 중간 삽입은 성능 고려
- 📌set/map.insert()는 자동 정렬이 적용되며 중복 불가
- 🔍삽입 위치는 반드시 유효한 iterator일 것
🧹 erase() 함수의 작동 원리와 주의점
STL에서 erase() 함수는 컨테이너에서 요소를 제거할 때 사용되며, insert와 마찬가지로 반복자(iterator)를 통해 동작합니다.
특정 위치나 구간을 지정해 유연하게 삭제할 수 있다는 점이 특징이죠.
가장 기본적인 형태는 다음과 같습니다.
std::vector<int> v = {1, 2, 3, 4};
v.erase(v.begin() + 1); // 결과: {1, 3, 4}
여기서 v.begin() + 1은 두 번째 요소를 가리키며, 해당 요소가 삭제됩니다.
또한 erase(start, end) 형식으로 반복자 구간을 지정하면 여러 요소를 한 번에 제거할 수도 있어요.
단, erase 사용 시 꼭 주의해야 할 점이 있습니다.
바로 삭제 이후 기존 iterator들이 무효화된다는 점인데요.
vector나 deque처럼 연속된 메모리 구조에서는 요소 삭제 시 모든 요소가 이동하면서 기존 반복자가 더 이상 올바른 위치를 가리키지 않게 됩니다.
⚠️ 주의: erase() 사용 후 기존 iterator를 계속 사용하면 런타임 오류나 예측 불가능한 동작이 발생할 수 있습니다.
- 🗑️단일 요소 삭제: erase(iterator)
- 📌범위 삭제: erase(start, end)는 end 이전까지 삭제
- 🚨삭제 후 반복자는 무효화되므로 새로 받아야 안전
⚙️ 반복자(iterator)를 활용한 고급 삽입/삭제
STL 컨테이너에서 insert와 erase는 대부분 반복자(iterator)를 통해 요소의 위치를 지정하게 됩니다.
이 반복자 개념을 정확히 이해하면 삽입과 삭제뿐만 아니라 다양한 순회 및 조건 제어까지 가능해져요.
예를 들어, vector에서 홀수만 제거하려면 일반 반복자 사용 시 erase 후 반복자가 무효화되므로 반복자 갱신을 반드시 고려해야 합니다.
std::vector<int> v = {1, 2, 3, 4, 5};
for (auto it = v.begin(); it != v.end(); ) {
if (*it % 2 != 0)
it = v.erase(it);
else
++it;
}
erase는 삭제한 다음 요소의 iterator를 반환하기 때문에, 삭제 이후 it = erase(it)로 갱신해야만 다음 순회가 정상적으로 이뤄집니다.
그렇지 않으면 무효화된 반복자를 참조하여 오류가 발생할 수 있어요.
insert 역시 반복자 기반이지만, 삽입 이후의 iterator는 여전히 유효하기 때문에 상대적으로 안전한 편이에요.
단, vector나 deque에서는 삽입으로 인해 전체 구조가 재배치(reallocation)될 수 있으므로 여전히 주의가 필요합니다.
💎 핵심 포인트:
반복자를 사용하는 insert/erase는 유연하면서도 위험 요소가 존재합니다. 특히 삭제 후에는 반드시 반복자를 재설정해야 합니다.
- 🔁erase 후 반복자는 it = erase(it) 형태로 갱신
- 🔎조건 기반 삭제 시 반복자 제어 필수
- 📥insert는 삽입 후에도 반복자가 유효한 경우가 많음
📦 vector, list, map 별 insert/erase 비교
STL에서 제공하는 컨테이너들은 각기 다른 내부 구조를 가지고 있으며, 이로 인해 insert()와 erase()의 동작 방식과 성능이 크게 달라집니다.
vector, list, map의 대표적인 차이점을 아래와 같이 정리할 수 있어요.
| 컨테이너 | insert() | erase() |
|---|---|---|
| vector | 중간 삽입 시 O(n), 끝에 삽입은 O(1) | 중간 삭제 시 O(n), 끝 요소는 O(1) |
| list | 어느 위치든 O(1)로 삽입 가능 | 빠르고 반복자 무효화 없음 |
| map | 자동 정렬된 위치에 O(log n) 삽입 | key 기준으로 O(log n) 삭제 |
이처럼 같은 insert와 erase 함수라도 컨테이너마다 내부 처리 방식과 시간 복잡도가 달라지기 때문에, 사용하는 자료 구조에 따라 효율을 고려해 선택해야 합니다.
💎 핵심 포인트:
vector는 빠른 끝 삽입, list는 빠른 중간 조작, map은 키 기반 자동 정렬에 강점을 갖고 있습니다.
- 📌vector는 뒤에 추가할수록 성능 좋음
- 🧵list는 중간 삽입/삭제가 매우 빠름
- 🗂️map은 자동 정렬과 키 기반 접근이 필요할 때 유리
🚀 insert/erase 성능 최적화 팁
STL의 insert와 erase는 매우 유용한 도구이지만, 반복적인 사용이나 대용량 데이터 처리 시 성능 문제가 발생할 수 있습니다.
따라서 컨테이너 특성과 상황에 따라 적절한 사용 전략을 세우는 것이 중요합니다.
가장 먼저 고려해야 할 점은 반복자 사용입니다.
특히 erase 사용 시에는 무효화된 iterator 접근을 방지하고, 루프 내에서 반복자 갱신을 철저히 관리해야 해요.
또한 vector처럼 메모리 재배치가 발생하는 컨테이너에서는 insert의 위치에 따라 성능 차이가 크기 때문에 가급적 push_back()을 활용하는 것이 안전합니다.
반복 삽입이 필요한 경우는 reserve()나 resize() 등을 이용해 미리 메모리를 확보해두는 것도 좋은 전략입니다.
💡 TIP: 알고리즘 실행 전 정렬이 필요한 경우는 map/set을 쓰는 대신 vector + sort를 활용해 속도를 높일 수 있어요.
- 🚧erase는 반복자 갱신 필수, 루프 내 관리 주의
- 🧠vector는 중간 삽입보다 push_back() 권장
- 📏반복 삽입 전 reserve()로 용량 확보하면 효율적
- ⚡정렬된 데이터는 map보다 vector + sort가 더 빠를 수 있음
❓ 자주 묻는 질문 (FAQ)
insert와 push_back의 차이점은 무엇인가요?
erase 함수는 어떤 경우에 반복자 무효화가 발생하나요?
list에서 insert와 erase는 왜 빠른가요?
map의 insert는 왜 중복을 허용하지 않나요?
multimap에서는 insert가 중복을 허용하나요?
insert 또는 erase 후에 반드시 iterator를 갱신해야 하나요?
vector에서 중간 요소를 여러 개 한 번에 삭제할 수 있나요?
컨테이너의 모든 요소를 제거할 땐 erase 대신 무엇을 사용하나요?
📌 insert와 erase를 이해하면 STL이 쉬워집니다
지금까지 C++ STL에서 핵심 함수인 insert()와 erase()에 대해 상세히 살펴봤습니다.
이 두 함수는 단순한 삽입·삭제 이상의 의미를 가지며, 반복자와 함께 쓰이면 컨테이너를 정밀하게 제어할 수 있게 해줍니다.
특히 vector, list, map처럼 내부 구조가 다른 컨테이너에서는 동일한 함수라도 성능과 사용법이 달라지므로, 각 특징을 정확히 이해하고 사용하는 것이 중요합니다.
insert와 erase의 사용은 프로그래밍 실력의 큰 기준이 되기도 해요.
무심코 사용하던 반복자가 왜 오류를 일으키는지, 어느 컨테이너가 어떤 상황에 적합한지 고민하는 습관이 실력 향상의 시작이 됩니다.
이번 글에서 배운 내용을 토대로 실제 문제에 적용해보세요.
분명 코드가 한층 더 깔끔하고, 효율적으로 변할 거예요.
🏷️ 관련 태그 : STL활용법, C++프로그래밍, vector사용법, list활용팁, map정렬, 반복자사용법, C++기초, erase예제, insert활용, 자료구조조작