最近在做麻将时将牌值存到std::vector里面,需要同时删除好几张牌时一时竟然没写出来。
vector在erase一个元素的时候会自动返回下一个元素的迭代器,删除掉一个元素之后,如果没有break掉,那么下一轮删除的时候迭代器需要重新赋值,最好是break,这样for可以少一点
先试试不删掉之后不break,下一轮给迭代器重新赋值:
#include <iostream> #include <vector> using namespace std; int main() { vector<int> values; vector<int> del_values; for (int i = 0; i < 10; i++) { values.push_back(i); } del_values.push_back(4); del_values.push_back(5); vector<int>::iterator it = values.begin(); for (int v : del_values) { for (; it != values.end();) { if (v == *it) { it = values.erase(it); } else { it++; } } it = values.begin(); } for (int v : values) { cout << v << endl; } system("pause"); return 0; }
输出正常。
试试删除一个之后break出去继续下一轮:
for (int v : del_values) { for (; it != values.end();) { if (v == *it) { it = values.erase(it); break; } else { it++; } } }
差别就一点点,想想还是后面这种好一些。