vector
vector的erase的机制是,erase一个元素,将后续元素向前移动,所以删除元素无需继续++
typedef std::vector<int> Container;
Container container;
container.push_back(10);
container.push_back(10);
container.push_back(10);
container.push_back(10);
container.push_back(12);
for (Container::iterator iter = container.begin(); iter != container.end();) {
if (*iter == 10)
container.erase(iter); // 不是container.erase(iter++);
else
++iter;
}
更简便点的方式是:
container.erase(remove(container.begin(),container.end(),
10),
container.end());
如此操作,capacity不变,size修改了.
deque
deque想以同样的方式erase则会出问题
typedef std::deque<int> Container;
Container container;
container.push_back(10);
container.push_back(10);
container.push_back(10);
container.push_back(10);
container.push_back(10);
printElement(container);
for (Container::iterator iter = container.begin(); iter != container.end();) {
if (*iter == 10)
container.erase(iter);
else
++iter;
}
printElement(container);
cout << "container size=" << container.size() << endl;
以上操作会使迭代器失效,可以使用如下方式:
container.erase(remove(container.begin(),container.end(),
10),
container.end());
map, set, multimap, multiset
自不必多说,在erase之后执行++即可。
container.erase(iter++);
caution remove并不适用于关联容器