'Control flow with iterators
Say I have something like this:
void myFunk(std::vector<T>& v, std::vector<T>::iterator first, std::vector<T>::iterator last) {
while (first != last) {
if ((*first) > (*last)) {
T someT;
v.push_back(someT);
}
first++;
}
}
int main(){
std::vector<T> foo = {some, T, values};
myFunky(foo, foo.begin(), foo.end())
return 0;
}
Would this lead to an infinite loop, or would it end after foo.size() iterations? In other words, would the last iterator be updated as foo grew, or would it retain the value given in the function call?
I'm assuming last would change, since it's a pointer to a position, but would like some confirmation.
Solution 1:[1]
Would this lead to an infinite loop, or would it end after
foo.size()iterations?
Neither. What you are doing is undefined behavior, for a couple of reasons:
You are modifying the
vectorwhile iterating through it.If the vector reallocates its internal storage when pushing a new item, all existing iterators into the
vectorare invalidated, including both iterators you are using to loop with. But even just pushing a new item always invalidates theend()iterator, at least.You are dereferencing the
end()iterator, which never refers to a valid element.
I'm assuming
lastwould change, since it's a pointer to a position
It can't change, since you passed it into the myFunc function by value, so it is a copy of the original end() iterator. If end() changes value, last will not change value, since it is a copy.
In any case, iterators are not necessarily implemented as pointers, but pointers are valid iterators. But it doesn't matter in this case. Even if vector::iterator were just a simple pointer, last would still get invalidated upon every push/reallocation.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
