struct st_data { st_data(int i) : id(i) {} int id; };
对于STL标准序列容器vector/deque/list(以vector为例)
当我们需清空容器vector<st_data*> vec时, 只需简单循环遍历即可
for (auto it = vec.begin(); it != vec.end(); ++it) { delete (*it); *it = nullptr; } vec.clear();
但如果想删除所有id%2 == 0的所有元素呢?
首先想到的是:
for (auto it = vec.begin(); it != vec.end(); ++it) { st_data *ptr = *it; if (ptr->id % 2 == 0) { vec.erase(it); delete ptr; ptr = nullptr; } }
千万不要! 因为当容器的一个元素被删除时, 指向那个元素的所有迭代器也都全部失效了.
正确方法如下:
for (auto it = vec.begin(); it != vec.end();) { st_data *ptr = *it; if (ptr->id % 2 == 0) { it = vec.erase(it); delete ptr; ptr = nullptr; } else { ++it; } }
注:若为标准关联容器, 则采取不同的策略
对于map<int, st_data*> mpData; 正确使用方法为:
map<int, st_data*> mpData; for (auto it = mpData.begin(); it != mpData.end();) { st_data *ptr = it->second; if (ptr->id % 2 == 0) { mpData.erase(it++); } else { ++it; } }
时间: 2024-10-12 11:53:20