std::vector 中remove()只是将待删除元素之后的元素移动到vector的前端,而不是真正删除。若要真正移除,需要搭配使用erase()。
二、论证代码#include三、真正实现删除#include using namespace std; int main() { const int VECTOR_SIZE = 8; // Define a template class vector of integers vector Numbers(VECTOR_SIZE); //Initialize vector Numbers Numbers[0] = 10; Numbers[1] = 20; Numbers[2] = 10; Numbers[3] = 15; Numbers[4] = 12; Numbers[5] = 7; Numbers[6] = 9; Numbers[7] = 10; cout << "The Numbers:" << endl; for (auto itor : Numbers) { cout << itor << " " ; } cout << endl; cout << "After remove() The Numbers:" << endl; auto itorLast = remove(Numbers.begin(), Numbers.end(), 10); for (auto itor : Numbers) { cout << itor << " "; } cout << endl; cout << "After remove() The removed Number count:" << Numbers.end() - itorLast << endl; cout << "After remove() The wanted Numbers:" << endl; for (auto itor = Numbers.begin(); itor != itorLast; itor++) { cout << *itor << " "; } return 0; }
#include四、关于erase()使用误区using namespace std; #include int main() { const int VECTOR_SIZE = 8; // Define a template class vector of integers vector Numbers(VECTOR_SIZE); //Initialize vector Numbers Numbers[0] = 10; Numbers[1] = 20; Numbers[2] = 10; Numbers[3] = 15; Numbers[4] = 12; Numbers[5] = 7; Numbers[6] = 9; Numbers[7] = 10; cout << "The Numbers:" << endl; for (auto itor : Numbers) { cout << itor << " " ; } cout << endl; Numbers.erase(remove(Numbers.begin(), Numbers.end(), 10), Numbers.end()); for (auto itor : Numbers) { cout << itor << " "; } return 0; }
错误用法:earase()结束后,iter变成了野指针,iter++就产生了错误。
for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) { veci.erase(iter); } }
另一种错误:无法删除连续两个3.
for(vector::iterator iter=veci.begin(); iter!=veci.end(); iter++) { if( *iter == 3) iter = veci.erase(iter); }
正确用法:
for(vector五、对于有序数组去重::iterator iter=veci.begin(); iter!=veci.end(); ) { if( *iter == 3) iter = veci.erase(iter); else iter ++ ; }
// 先排序 sort(Numbers.begin(), Numbers.end()); // 去除重复 Numbers.erase(unique(Numbers.begin(), Numbers.end()), Numbers.end());