C++ 的erase和remove remove_if删除元素
1. erase
很多时候,我在删除vector元素的时候使用的是遍历指针,符合条件时使用erase删除,
可是这样的使用办法会有个问题,在vec.erase(iter)后,需要使用erase的返回值,并且这个返回值是等价iter++,也就是iter的下一个元素,
否则的话,iter将会是个无效指针
vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) { if (*iter == 6){ iter = vec_int.erase(iter); } else{ ++iter; } } for (auto& i : vec_int) { printf("i = %d\n", i); }
可是从MSDN中看到erase并不是这么用的
vector <int> v1; vector <int>::iterator Iter; v1.push_back( 10 ); v1.push_back( 20 ); v1.push_back( 30 ); v1.push_back( 40 ); v1.push_back( 50 ); cout << "v1 =" ; for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter; cout << endl; v1.erase( v1.begin( ) ); cout << "v1 ="; for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter; cout << endl; v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 ); cout << "v1 ="; for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ ) cout << " " << *Iter;
output:
v1 = 10 20 30 40 50 v1 = 20 30 40 50 v1 = 20 50
MSDN中给出的用法是直接删除某一个或者一段的元素
2.remove和remove_if
实际使用中,删除指定元素更为准确的用法应该是使用remove和remove_if。
bool isOdd(int value)
{
return (value % 2) == 1;
}
vector<int> vec_int = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; vec_int.erase(remove_if(vec_int.begin(), vec_int.end(), isOdd), vec_int.end()); for (auto& i : vec_int) { printf("i = %d\n", i); } vec_int.erase(remove(vec_int.begin(), vec_int.end(), 8)); for (auto& i : vec_int) { printf("i = %d\n", i); } for (vector<int>::iterator iter = vec_int.begin(); iter != vec_int.end();) { if (*iter == 6){ iter = vec_int.erase(iter); } else{ ++iter; } } for (auto& i : vec_int) { printf("i = %d\n", i); }
output:
i = 0 i = 2 i = 4 i = 6 i = 8 i = 0 i = 2 i = 4 i = 6 i = 0 i = 2 i = 4
容器 | 迭代器功能 |
---|---|
vector | 随机访问 |
deque | 随机访问 |
list | 双向 |
set / multiset | 双向 |
map / multimap | 双向 |
stack | 不支持迭代器 |
queue | 不支持迭代器 |
priority_queue | 不支持迭代器 |