我正在尝试使用erase和列表迭代器从C链接列表中删除项目:
#include <iostream> #include <string> #include <list> class Item { public: Item() {} ~Item() {} }; typedef std::list<Item> list_item_t; int main(int argc,const char *argv[]) { // create a list and add items list_item_t newlist; for ( int i = 0 ; i < 10 ; ++i ) { Item temp; newlist.push_back(temp); std::cout << "added item #" << i << std::endl; } // delete some items int count = 0; list_item_t::iterator it; for ( it = newlist.begin(); count < 5 ; ++it ) { std::cout << "round #" << count << std::endl; newlist.erase( it ); ++count; } return 0; }
我得到这个输出,似乎无法追查原因:
added item #0 added item #1 added item #2 added item #3 added item #4 added item #5 added item #6 added item #7 added item #8 added item #9 round #0 round #1 Segmentation fault
我可能做错了,但无论如何都会很感激.谢谢.
解决方法
这里的核心问题是你在迭代器值上使用它,在你调用擦除之后.擦除方法使迭代器无效,因此继续使用它会导致不良行为.相反,您希望使用erase的返回来获取擦除值之后的下一个有效迭代器.
it = newList.begin(); for (int i = 0; i < 5; i++) { it = newList.erase(it); }
包含对newList.end()的检查以考虑列表中不存在至少5个元素的情况也没有什么坏处.
it = newList.begin(); for (int i = 0; i < 5 && it != newList.end(); i++) { it = newList.erase(it); }
正如Tim所指出的,这里有一个很好的擦除参考