i want loop through vector
, remove item each time. believe should use erase-remove idiom. believe erase
on vector
invalidates of iterators. if that's case, how can use idiom in while
loop?
here's broken example:
std::vector<int> vec = { 3, 6, 7, 5 }; auto itr = vec.begin(); while (itr != vec.end()) { // i'll remove different element each iteration of loop. // hard-coded "7" here simplicity: auto position = std::remove(vec.begin(), vec.end(), 7); vec.erase(position); ++itr; }
the purpose of code loop through vector
, remove element each time. use while
loop , iterator because size of vector changes after each iteration. i'll remove largest element each iteration, i'm not showing code keep simpler. so, elements removed in order: 7, 6, 5, 3. again, code isn't shown.
std::remove()
moves elements (not 1 element!) of specified value end of container, , returns new logical past-end iterator. std::remove()
not invalidate iterators, items not physically removed , container size not changed. values inside container moved around.
after have "removed" want remove, call erase()
1 time @ end physically remove items container.
try this:
std::vector<int> vec = { 3, 6, 7, 5 }; auto itr = vec.begin(); auto end = vec.end(); while (itr != end) { end = std::remove(vec.begin(), end, ...); ++itr; } vec.erase(end, vec.end());
Comments
Post a Comment