企业门户网站建设 验收,wordpress 部署报错,济宁建设局官方网站,互联网网站备案流程今天看Scott Meyers大师的stl的用法#xff0c;看到了我前段时间犯的一个错误#xff0c;发现我写的代码和他提到错误代码几乎一模一样#xff0c;有关stl容器删除元素的问题#xff0c;错误的代码如下#xff1a;std::vectorstruct mFriendList;...std::vector看到了我前段时间犯的一个错误发现我写的代码和他提到错误代码几乎一模一样有关stl容器删除元素的问题错误的代码如下std::vectorstruct mFriendList;...std::vectorstruct::iterator iter mFriendList.begin();for ( ; iter ! mFriendList.end(); iter){ if (...) mFriendList.erase(iter);}记得当时Once给我说过这个问题还给我改过代码我当时不明白为什么只知道程序执行的时候如果if为true那么程序就肯定会崩溃。大师的说法是当容易中的一个元素被删除时指向该元素的所有迭代器都变得无效。上面的代码中只要执行了erase(iter),那么iter就会变得无效那么执行iter就肯定会出错。在网上看到有人总结如下两条1. 对于节点式容器(map, list, set)元素的删除插入操作会导致指向该元素的迭代器失效其他元素迭代器不受影响2. 对于顺序式容器(vectorstringdeque)元素的删除、插入操作会导致指向该元素以及后面的元素的迭代器失效总结了一下并回想Once当时给我改的代码所以正确的写法应该是这样的1.对于节点式容器std::liststruct mList;...std::liststruct::iterator iter mList.begin();for ( ; iter ! mList.end(); ){ if (...) { //因为节点式只会导致当前节点迭代器失效所以删除节点的同时对迭代器进行后移的操作因为其他元素不会失效 mList.erase(iter); } else { iter; }}2.对于顺序式容器std::vectorstruct mVector;...std::vectorstruct::iterator iter mVector.begin();for ( ; iter ! mVector.end(); ){ if (...) { //这里就比较有说法了因为顺序式容器会使本身和后面的元素迭代器都失效所以不能简单的操作 //这里顺序式容器的erase()会返回紧随被删除元素的下一个元素的有效迭代器 //而节点式容器的erase()的返回值是void这点我感觉太神奇了确实太神奇了 iter mVector.erase(iter); } else { iter; }} 注意容器看具体STL库的实现了VS中两类容器的earse都返回下一个迭代器指针。
相关文章: