C++ - 각종 STL 컨테이너에서 루프 중 요소 삭제하기
vector
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
vector<int>::iterator it = v.begin();
while (it != v.end()) {
if (*it == 20) {
it = v.erase(it);
} else ++it;
}
it = v.begin();
while (it != v.end()) {
cout << *it << endl;
++it;
}
deque
deque<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
deque<int>::iterator it = v.begin();
while (it != v.end()) {
if (*it == 20) {
it = v.erase(it);
} else ++it;
}
it = v.begin();
while (it != v.end()) {
cout << *it << endl;
++it;
}
list
list<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
list<int>::iterator it = v.begin();
while (it != v.end()) {
if (*it == 20) {
it = v.erase(it);
} else ++it;
}
it = v.begin();
while (it != v.end()) {
cout << *it << endl;
++it;
}
map
map<int, int> v;
v[10] = 10;
v[20] = 20;
v[30] = 30;
map<int, int>::iterator it = v.begin();
while (it != v.end()) {
if (it->second == 20) {
v.erase(it++);
} else ++it;
}
it = v.begin();
while (it != v.end()) {
cout << it->first << " " << it->second << endl;
++it;
}
multimap
multimap<int, int> v;
v.insert(make_pair(10, 10));
v.insert(make_pair(20, 20));
v.insert(make_pair(30, 30));
multimap<int, int>::iterator it = v.begin();
while (it != v.end()) {
if (it->second == 20) {
v.erase(it++);
} else ++it;
}
it = v.begin();
while (it != v.end()) {
cout << it->first << " " << it->second << endl;
++it;
}
set
set<int> v;
v.insert(10);
v.insert(20);
v.insert(30);
set<int>::iterator it = v.begin();
while (it != v.end()) {
if (*it == 20) {
v.erase(it++);
} else ++it;
}
it = v.begin();
while (it != v.end()) {
cout << *it << endl;
++it;
}
vector와 deque 같은 시퀸스 컨테이너들은 erase의 반환 값이 반복자이므로 이것이 다음의 반복자가 된다.
map, set 같은 연관 컨테이너들은 erase 한 반복자는 무효한 주소를 가리키므로 it++을 넘겨서 반복자를 복사하면서 요소를 삭제하고, 반복자를 진행시킨다. -> 복사된 반복자를 사용하여 연관 컨테이너의 요소를 삭제한다.
이 글은 2019-09-30에 작성되었습니다.