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
Why isn't "I've" a proper response?
what mathematical functions can we use to generate patterns for rhythm (meter and notes)?
How to prevent clipped screen edges on my TV, HDMI-connected?
The Knight's estate
What is the difference between computational complexity and time complexity?
Why do banks “park” their money at the European Central Bank?
Is for(( ... )) ... ; a valid shell syntax? In which shells?
Is it possible to perform a regression where you have an unknown / unknowable feature variable?
Why did MS-DOS applications built using Turbo Pascal fail to start with a division by zero error on faster systems?
How to find out the average duration of the peer-review process for a given journal?
Does norwegian.no airline overbook flights?
Pythagorean triple with hypotenuse a power of 2
Is gzip atomic?
Why did this happen to Thanos's ships at the end of "Avengers: Endgame"?
Avoiding racist tropes in fantasy
Nothing like a good ol' game of ModTen
“T” in subscript in formulas
What to say to a student who has failed?
Would it be possible to have a GMO that produces chocolate?
Non-visual Computers - thoughts?
Is "The life is beautiful" incorrect or just very non-idiomatic?
Can you pop_back a vector and still use the iterator to the last element?
Is there any method of inflicting the incapacitated condition and no other condition?
Why is my Earth simulation slower than the reality?
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;
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
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.
add a comment |
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
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.
add a comment |
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
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
c++ vector iterator
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.
edited 7 hours ago
Nicol Bolas
305k37 gold badges511 silver badges691 bronze badges
305k37 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 8 hours ago
user3365922user3365922
585 bronze badges
585 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.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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());
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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());
add a comment |
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());
add a comment |
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());
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());
answered 7 hours ago
Nicol BolasNicol Bolas
305k37 gold badges511 silver badges691 bronze badges
305k37 gold badges511 silver badges691 bronze badges
add a comment |
add a comment |
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.
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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