<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      c++如何遍歷刪除map/vector里面的元素

      新技能Get!

      問題

      對于c++里面的容器, 我們可以使用iterator進行方便的遍歷. 但是當我們通過iterator對vector/map等進行修改時, 我們就要小心了, 因為操作往往會導致iterator失效, 之后的行為都變得不可預知. 比如:

      #include <iostream>
      #include <vector>
      
      using namespace std;
      
      int main()
      {
          vector<int> a = {12, 23, 34, 45, 56, 67, 78, 89};
          
          for (auto iter = a.begin(); iter != a.end(); ++iter) {
              if (*iter > 30) {
                  a.erase(iter);
              }
          }
          
          for (const auto &element : a) {
              cout<<element<<endl;
          }
          
          return 0;
      }
      
      輸出:
      
      12
      23
      45
      67
      89

      cplusplus的reference里對 std::vector::erase 的描述是:

      Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call.

      只有刪除元素前面的iterator還保持有效, 之后的遍歷行為不可預知.

      解決方案

      對于vector, erase會返回下一個iterator, 因此我們可以使用如下的方法:

      #include <iostream>
      #include <vector>
      
      using namespace std;
      
      int main()
      {
          vector<int> a = {12, 23, 34, 45, 56, 67, 78, 89};
          
          auto iter = a.begin();
          while (iter != a.end()) {
              if (*iter > 30) {
                  iter = a.erase(iter);
              }
              else {
                  ++iter;
              }
          }
          
          for (const auto &element : a) {
              cout<<element<<endl;
          }
          
          return 0;
      }
      
      
      輸出:
      
      12
      23
      

        

      對于map, 刪除iterator只會影響當前的iterator, 因此使用for循環就夠了, 比如:

      #include <iostream>
      #include <map>
      
      using namespace std;
      
      int main()
      {
          map<int, int> a = {{1, 12}, {2, 23}, {3, 34}, {4, 45}, {5, 56}, {6, 67}};
          
          for (auto iter = a.begin(); iter != a.end(); ++iter) {
              if (iter->second > 30) {
                  a.erase(iter);
              }
          }
          
          for (const auto &element : a) {
              cout<<element.first<<" : "<<element.second<<endl;
          }
          
          return 0;
      }
      
      輸出:
      
      1 : 12
      2 : 23
      

        但是更推薦的做法是在erase前讓iterator指向下一個元素

      #include <iostream>
      #include <map>
      
      using namespace std;
      
      int main()
      {
          map<int, int> a = {{1, 12}, {2, 23}, {3, 34}, {4, 45}, {5, 56}, {6, 67}};
          
          auto iter = a.begin();
          while (iter != a.end()) {
              if (iter->second > 30) {
                  a.erase(iter++);
              }
              else {
                  ++iter;
              }
          }
          
          for (const auto &element : a) {
              cout<<element.first<<" : "<<element.second<<endl;
          }
          
          return 0;
      }
      
      輸出:
      
      1 : 12
      2 : 23
      

        

      參考資料

      http://stackoverflow.com/questions/4645705/vector-erase-iterator

      http://stackoverflow.com/questions/4600567/how-can-i-delete-elements-of-a-stdmap-with-an-iterator

      posted on 2014-08-14 15:29  大寶pku  閱讀(51479)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 超碰人人超碰人人| 中文字幕精品无码一区二区| 成人无码潮喷在线观看| 噜噜噜噜私人影院| 日韩中文字幕精品人妻| 亚洲精品麻豆一二三区| 爱如潮水日本免费观看视频| 一本色道久久综合熟妇人妻| 开心五月婷婷综合网站| 国产高清免费午夜在线视频| 国产精品综合色区在线观| 午夜爽爽爽男女污污污网站| 日韩人妻久久精品一区二区| 精品欧美h无遮挡在线看中文| 中文字幕亚洲综合小综合| 无码人妻人妻经典| 美女黄网站人色视频免费国产| 久久久成人毛片无码| 久久精品女人天堂av免费观看| 国产免费无遮挡吃奶视频| 99精品国产一区二区三区不卡| 在线中文字幕亚洲日韩2020| 国产av一区二区不卡| 午夜成人性爽爽免费视频| 色婷婷五月综合久久| 亚洲天堂激情av在线| 年轻女教师hd中字3| 国产精品中文字幕免费| 亚洲乱码一二三四区国产| 猫咪AV成人永久网站在线观看| 4虎四虎永久在线精品免费| 大伊香蕉精品一区视频在线| 亚洲av精彩一区二区| 99精品国产中文字幕| 狠狠亚洲色一日本高清色| 综合激情网一区二区三区| 久久国产乱子伦免费精品无码| 午夜精品久久久久久久爽| 江陵县| 強壮公弄得我次次高潮A片| 免费无码一区无码东京热|