Can you pop_back a vector and still use the iterator to the last element?How do I erase an element from...

Can a Rogue PC teach an NPC to perform Sneak Attack?

How do you harvest carrots in creative mode?

Round towards zero

Sum ergo cogito?

“T” in subscript in formulas

Why isn't "I've" a proper response?

Are there any elected officials in the U.S. who are not legislators, judges, or constitutional officers?

Very slow boot time and poor perfomance

Uri tokenizer as a simple state machine

Why are non-collision-resistant hash functions considered insecure for signing self-generated information

How can I unambiguously ask for a new user's "Display Name"?

Prove your innocence

Two questions about typesetting a Roman missal

Showing that the limit of non-eigenvector goes to infinity

Are the players on the same team as the DM?

Rent contract say that pets are not allowed. Possible repercussions if bringing the pet anyway?

How to know which loss function is suitable for image classification?

Does an atom recoil when photon radiate?

Lost property on Portuguese trains

Why is there a difference between predicting on Validation set and Test set?

If two Lore Bards used cutting words on an ability check or attack, would they stack?

How do proponents of Sola Scriptura address the ministry of those Apostles who authored no parts of Scripture?

Architectural feasibility of a tiered circular stone keep

The No-Free-Lunch Theorem and K-NN consistency



Can you pop_back a vector and still use the iterator to the last element?


How do I erase an element from std::vector<> by index?Test if a vector contains a given elementWhat is the most effective way to get the index of an iterator of an std::vector?What is the easiest way to initialize a std::vector with hardcoded elements?std::vector iterator invalidationVector iterator comparisonusing erase with remove_ifC++ vector content not changed while using iterator






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







8















I wonder what happens if I have an iterator on the last element of the vector and do pop_back.



std::set<int> s;
s.insert(5);

std::vector<int> v = {1, 2, 3, 4, 5};

for (auto it = v.begin(); it != v.end();) {
if (s.count(*it)) {
std::swap(*it, v.back());
v.pop_back();
} else {
++it;
}
}


Code above works properly (v is {1, 2, 3, 4} after that block) at least with clang, but is it correct to check if it == v.end() if it is invalidated?










share|improve this question









New contributor



user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.




























    8















    I wonder what happens if I have an iterator on the last element of the vector and do pop_back.



    std::set<int> s;
    s.insert(5);

    std::vector<int> v = {1, 2, 3, 4, 5};

    for (auto it = v.begin(); it != v.end();) {
    if (s.count(*it)) {
    std::swap(*it, v.back());
    v.pop_back();
    } else {
    ++it;
    }
    }


    Code above works properly (v is {1, 2, 3, 4} after that block) at least with clang, but is it correct to check if it == v.end() if it is invalidated?










    share|improve this question









    New contributor



    user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.
























      8












      8








      8


      1






      I wonder what happens if I have an iterator on the last element of the vector and do pop_back.



      std::set<int> s;
      s.insert(5);

      std::vector<int> v = {1, 2, 3, 4, 5};

      for (auto it = v.begin(); it != v.end();) {
      if (s.count(*it)) {
      std::swap(*it, v.back());
      v.pop_back();
      } else {
      ++it;
      }
      }


      Code above works properly (v is {1, 2, 3, 4} after that block) at least with clang, but is it correct to check if it == v.end() if it is invalidated?










      share|improve this question









      New contributor



      user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      I wonder what happens if I have an iterator on the last element of the vector and do pop_back.



      std::set<int> s;
      s.insert(5);

      std::vector<int> v = {1, 2, 3, 4, 5};

      for (auto it = v.begin(); it != v.end();) {
      if (s.count(*it)) {
      std::swap(*it, v.back());
      v.pop_back();
      } else {
      ++it;
      }
      }


      Code above works properly (v is {1, 2, 3, 4} after that block) at least with clang, but is it correct to check if it == v.end() if it is invalidated?







      c++ vector iterator






      share|improve this question









      New contributor



      user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.










      share|improve this question









      New contributor



      user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.








      share|improve this question




      share|improve this question








      edited yesterday









      Nicol Bolas

      306k37 gold badges511 silver badges691 bronze badges




      306k37 gold badges511 silver badges691 bronze badges






      New contributor



      user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.








      asked yesterday









      user3365922user3365922

      635 bronze badges




      635 bronze badges




      New contributor



      user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.




      New contributor




      user3365922 is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





























          1 Answer
          1






          active

          oldest

          votes


















          8















          Your instincts are good; vector::pop_back invalidates iterators and references to the last element. If it is such an iterator, then it will be invalidated, and thus cannot be compared with v.end().



          It would be much better to fix this by using algorithms and the erase-remove idiom:



          auto last_it = std::remove_if(v.begin(), v.end(), [&](const auto &val) {return s.count(val) != 0;});
          v.erase(last_it, v.end());





          share|improve this answer


























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });






            user3365922 is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f57629086%2fcan-you-pop-back-a-vector-and-still-use-the-iterator-to-the-last-element%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            8















            Your instincts are good; vector::pop_back invalidates iterators and references to the last element. If it is such an iterator, then it will be invalidated, and thus cannot be compared with v.end().



            It would be much better to fix this by using algorithms and the erase-remove idiom:



            auto last_it = std::remove_if(v.begin(), v.end(), [&](const auto &val) {return s.count(val) != 0;});
            v.erase(last_it, v.end());





            share|improve this answer






























              8















              Your instincts are good; vector::pop_back invalidates iterators and references to the last element. If it is such an iterator, then it will be invalidated, and thus cannot be compared with v.end().



              It would be much better to fix this by using algorithms and the erase-remove idiom:



              auto last_it = std::remove_if(v.begin(), v.end(), [&](const auto &val) {return s.count(val) != 0;});
              v.erase(last_it, v.end());





              share|improve this answer




























                8














                8










                8









                Your instincts are good; vector::pop_back invalidates iterators and references to the last element. If it is such an iterator, then it will be invalidated, and thus cannot be compared with v.end().



                It would be much better to fix this by using algorithms and the erase-remove idiom:



                auto last_it = std::remove_if(v.begin(), v.end(), [&](const auto &val) {return s.count(val) != 0;});
                v.erase(last_it, v.end());





                share|improve this answer













                Your instincts are good; vector::pop_back invalidates iterators and references to the last element. If it is such an iterator, then it will be invalidated, and thus cannot be compared with v.end().



                It would be much better to fix this by using algorithms and the erase-remove idiom:



                auto last_it = std::remove_if(v.begin(), v.end(), [&](const auto &val) {return s.count(val) != 0;});
                v.erase(last_it, v.end());






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered yesterday









                Nicol BolasNicol Bolas

                306k37 gold badges511 silver badges691 bronze badges




                306k37 gold badges511 silver badges691 bronze badges























                    Got a question that you can’t ask on public Stack Overflow? Learn more about sharing private information with Stack Overflow for Teams.







                    Got a question that you can’t ask on public Stack Overflow? Learn more about sharing private information with Stack Overflow for Teams.












                    user3365922 is a new contributor. Be nice, and check out our Code of Conduct.










                    draft saved

                    draft discarded


















                    user3365922 is a new contributor. Be nice, and check out our Code of Conduct.













                    user3365922 is a new contributor. Be nice, and check out our Code of Conduct.












                    user3365922 is a new contributor. Be nice, and check out our Code of Conduct.
















                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f57629086%2fcan-you-pop-back-a-vector-and-still-use-the-iterator-to-the-last-element%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Taj Mahal Inhaltsverzeichnis Aufbau | Geschichte | 350-Jahr-Feier | Heutige Bedeutung | Siehe auch |...

                    Baia Sprie Cuprins Etimologie | Istorie | Demografie | Politică și administrație | Arii naturale...

                    Nicolae Petrescu-Găină Cuprins Biografie | Opera | In memoriam | Varia | Controverse, incertitudini...