<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ##實戰c++中的vector系列--emplace_back造成的引用失效 上篇將了對于struct或是class為何emplace_back要優越于push_back,但是還有一些細節沒有提及。今天就談一談emplace_back造成的引用失效。 直接擼代碼了: ~~~ #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector<int> ivec; ivec.emplace_back(1); ivec.emplace_back(ivec.back()); for (auto it = ivec.begin(); it != ivec.end(); ++it) cout << *it << " "; return 0; } //輸出: 1 -572662307 ~~~ 嘗試1:不直接給emplace_back傳遞ivec.back(): ~~~ #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector<int> ivec; ivec.emplace_back(1); auto &it = ivec.back(); ivec.emplace_back(it); for (auto it = ivec.begin(); it != ivec.end(); ++it) cout << *it << " "; return 0; } 輸出: 1 -572662307 ~~~ 嘗試2:不給emplace_back傳遞引用: ~~~ #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector<int> ivec; ivec.emplace_back(1); auto it = ivec.back(); ivec.emplace_back(it); for (auto it = ivec.begin(); it != ivec.end(); ++it) cout << *it << " "; return 0; } 輸出: 1 1 ~~~ 我們如愿以償,這時候應該可以得到結論了,ivec.back()返回的是引用,但是這個引用失效了,所以才會輸出不正確;我們之前也提到過,重新分配內存會造成迭代器的失效,這里是造成了引用的失效。 再回頭看看emplace_back的描述:? if a reallocation happens, all iterators, pointers and references related to this container are invalidated.? Otherwise, only the end iterator is invalidated, and all other iterators, pointers and references to elements are guaranteed to keep referring to the same elements they were referring to before the call. 進一步。 嘗試3:避免emplace_back引起重新分配內存: ~~~ #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector<int> ivec; ivec.reserve(4); ivec.emplace_back(1); ivec.emplace_back(ivec.back()); for (auto it = ivec.begin(); it != ivec.end(); ++it) cout << *it << " "; return 0; } 輸出: 1 1 ~~~ 但是這個時候問題來了,如果不使用emplace_back而改用push_back呢? ~~~ #include <vector> #include <string> #include <iostream> using namespace std; int main() { vector<int> ivec; ivec.push_back(1); ivec.push_back(ivec.back()); ivec.push_back(ivec.back()); ivec.push_back(ivec.back()); for (auto it = ivec.begin(); it != ivec.end(); ++it) cout << *it << " "; return 0; } //輸出: 1 1 1 1 ~~~ 為什么使用push_back就不失效呢?
                  <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>

                              哎呀哎呀视频在线观看