vector
錯誤做法
這樣做會在遍歷過程中越界導致程序崩潰
std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (auto i = vecInt.begin(); i != vecInt.end() ; ++i) {if (*i == 1) {vecInt.erase(i);}}
正確做法
std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (auto i = vecInt.begin(); i != vecInt.end();) {if (*i == 1) {vecInt.erase(i);}else {++i;}}
調用erase函數后迭代器會指向被刪除元素的下一個元素,如果被刪除的元素是容器最后一個元素,則指向容器的end()
map
錯誤做法
std::map<int, std::string> map_i_s;map_i_s.insert({ 1, "1" });map_i_s.insert({ 2, "2" });map_i_s.insert({ 3, "3" });for (auto i = map_i_s.begin(); i != map_i_s.end(); ++i;) {if (i->first > 2) {map_i_s.erase(i);}}
正確做法
std::map<int, std::string> map_i_s;map_i_s.insert({ 1, "1" });map_i_s.insert({ 2, "2" });map_i_s.insert({ 3, "3" });for (auto i = map_i_s.begin(); i != map_i_s.end(); ) {if (i->first > 2) {i = map_i_s.erase(i);}else {++i;}}