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;
}
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
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
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
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
New contributor
edited yesterday
Nicol Bolas
306k37 gold badges511 silver badges691 bronze badges
306k37 gold badges511 silver badges691 bronze badges
New contributor
asked yesterday
user3365922user3365922
635 bronze badges
635 bronze badges
New contributor
New contributor
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 yesterday
Nicol BolasNicol Bolas
306k37 gold badges511 silver badges691 bronze badges
306k37 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