最近在做麻將時將牌值存到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++; } } }
差別就一點點,想想還是后面這種好一些。