删除容器特定元素惯用法
vector, string, deque, array, 使用erase-remove习惯的用法
//删除值为2的元素
std::string content("hello world");
content.erase(std::remove(content.begin(), content.end(), ' '), content.end());
list, 使用list::remove
//删除值为2的元素
std::list<int> numbers = { 1,2,3,4 };
numbers.remove(2);
标准的关联容器,使用erase成员函数
//删除值为2的元素
std::map<int, int> values = { {1,1},{2,2},{3,3} };
values.erase(2);
删除容器满足特定条件元素的惯用法
vector, string, deque, array, 使用erase-remove习惯的用法
//删除条件是:空格或Tab键的元素
std::string content("hello world");
content.erase(std::remove_if(content.begin(), content.end(), [](const char x)
{return std::isspace(x) || x == '\t'; }),
content.end());
list, 使用list::remove
//删除条件是:值为2的元素
std::list<int> numbers = { 1,2,3,4 };
numbers.remove_if([](const int item) {return item == 2; });
标准的关联容器,使用remove_copy_if和swap,或者写一个循环来遍历容器中的所有元素,记住当把迭代器传给erase时,要对它进行后缀递增
//删除条件是:key为2的元素
std::map<int, int> values = { {1,1},{2,2},{3,3} };
std::map<int, int> valueTemps;
remove_copy_if(values.begin(), values.end(), inserter(valueTemps, valueTemps.end()),
[](const std::pair<int, int>& item) {
return item.first == 2;
});
swap(values, valueTemps);
//删除条件是:key为2的元素
std::map<int, int> values = { {1,1},{2,2},{3,3} };
std::map<int, int> valueTemps;
for (auto iter = values.begin(); iter != values.end();)
{
if (iter->first == 2)
{
values.erase(iter++);
}
else
{
++iter;
}
}
注意:
采用erase-remove惯用法主要是基于性能考虑。因为对于顺序存储的容器如vector, string, deque, array来说,删除元素需要移动元素,代价很大。remove实现机制是统一先找出哪些元素需要被覆盖,等全部找到以后在进行一次性覆盖,而不是每找到一个需要覆盖的元素就将其进行覆盖。