工作8年,第一次遇到这种问题,百思不得其解,使用erase删除vector元素,删除正常,但后面打印数据发现,元素居然依然存在。当然其实最终发现原因也是不注意代码细节引起的。先上代码。 注:以下代码在windows环境直接报错,而linux居然正常输出。
#include <iostream> #include <vector> using namespace std; int main() { std::vector<int> vec; for (int i = 0; i < 10; ++i) { vec.push_back(i); } vec.push_back(1); vec.push_back(1); vec.push_back(1); vec.push_back(1); for (auto it = vec.begin(); it != vec.end();) { cout << *it << endl; it++; } cout << "*************line******************" << endl; int nSize = vec.size(); for (auto it = vec.begin(); it != vec.end();) { if (1 == *it) { it = vec.erase(it); } else { ++it; } } auto it = vec.begin(); for (int n = 0; n < nSize;n++) { cout << *it << endl; it++; } system("pause"); return 0; }在上输出数据: 看到没,删除的元素居然依然存在,其实是因为野指针原因引起的,由于编译器的差异,还真不一定会报错。 所以在开发过程中一定要注意细节,最后修改如下:
#include <iostream> #include <vector> using namespace std; int main() { std::vector<int> vec; for (int i = 0; i < 10; ++i) { vec.push_back(i); } vec.push_back(1); vec.push_back(1); vec.push_back(1); vec.push_back(1); for (auto it = vec.begin(); it != vec.end();) { cout << *it << endl; it++; } cout << "*************line******************" << endl; for (auto it = vec.begin(); it != vec.end();) { if (1 == *it) { it = vec.erase(it); } else { ++it; } } //将size位置变动 int nSize = vec.size(); auto it = vec.begin(); for (int n = 0; n < nSize;n++) { cout << *it << endl; it++; } system("pause"); return 0; }修改后输出如下: