<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ##沒有躲過的坑--vector使用erase后迭代器變成野指針 vector上鏡率非常高,但是最近又被他fuck了一下。使用的就是vector的erase方法。 **erase–return value**? 首先需要明確一下vector的兩種erase: C++98中是這樣的: ~~~ iterator erase (iterator position); iterator erase (iterator first, iterator last) ~~~ C++11是這樣的: ~~~ iterator erase (const_iterator position); iterator erase (const_iterator first, const_iterator last); ~~~ 我們使用下面的代碼進行erase: ~~~ #include <iostream> #include <vector> int main () { std::vector<int> myvector; // set some values (from 1 to 10) for (int i=1; i<=10; i++) myvector.push_back(i); // erase the 6th element myvector.erase (myvector.begin()+5); // erase the first 3 elements: myvector.erase (myvector.begin(),myvector.begin()+3); std::cout << "myvector contains:"; for (unsigned i=0; i<myvector.size(); ++i) std::cout << ' ' << myvector[i]; std::cout << '\n'; return 0; } /*-------------------------------------- Output: myvector contains: 4 5 7 8 9 10 ---------------------------------------*/ ~~~ 上面的代碼非常的完美,但是當把ease用于for循環的時候,就完蛋了: ~~~ for(vector<int>::iterator iter=vector_database.begin(); vector_database!=veci.end(); iter++) { if( *iter == 10) { vector_database.erase(iter); } } ~~~ 當執行veci.erase(iter)后,迭代器iter指向了哪里? 是時候關注一下erase方法的返回值了: An iterator pointing to the new location of the element that followed the last element erased by the function call. This is the container end if the operation erased the last element in the sequence. Member type iterator is a?**random**?access iterator type that points to elements. 看到random你就要瘋掉了吧,野指針!!!! 也就是說veci.erase(iter)后,iter的狀態是不確定的,再進行++,豈有不崩潰的道理!! 解決方法一,就是ease后對iter進行重新賦值。? 解決方法二:再 使用一個迭代器。 ~~~ vector<int>::iterator itor2; for(vector<int>::iterator iter=vector_database.begin(); iter!=vector_database.end(); ) { if( *iter == 10) { itor2=iter; vector_database.erase(itor2); } else iter ++ ; } ~~~ **remove or erase?**? 很多人還用到過remove,但是對于很多人不能分清楚remove和erase的區別? STL中remove()只是將待刪除元素之后的元素移動到vector的前端,而不是刪除。若要真正移除,需要搭配使用erase()。 vector中的remove的作用是將等于value的元素放到vector的尾部,但并不減少vector的size vector中erase的作用是刪除掉某個位置position或一段區域(begin, end)中的元素,減少其size **erase with remove_if** ~~~ vector_database.erase( std::remove_if(vector_database.begin(), vector_database.end(), [this](const unique_ptr<lesschat::Channel>& vector_database) { return this->current_channel_id_ == vector_database->channel_id(); })); ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看