I was learning some builtin functions in STL. And I wrote these code.
#include <bits/stdc++.h>
int main() {
std::deque<int> tmp{1, 2, 3};
std::transform(tmp.begin(), tmp.end(), std::back_insert_iterator<std::deque<int>>(tmp), std::negate<>());
std::copy(tmp.begin(), tmp.end(), std::ostream_iterator<int> (std::cout, "\n"));
std::vector<int> now{1, 2, 3};
std::transform(now.begin(), now.end(), std::back_insert_iterator<std::vector<int>>(now), std::negate<>());
std::copy(now.begin(), now.end(), std::ostream_iterator<int> (std::cout, "\n"));
return 0;
}
And I compile this code, with GCC 6.1.1, option -Wall -std=c++14. The the output of the code was:
1 2 3 -1 -2 -3 1 2 3 -1 0 -3
In my opinion, the 0 in the output should be -2. Am I wrong? If I use the back_insert_iterator wrong, please point it out. Thank you. If not, is this a bug for GCC 6.1.1? Feel free to compile this code on your own computer with different compiler and share your result. Thank you for the help. :)
UPD
I use the iterator wrong, push_back may cause relocation. CLOSED. Thank you again for the help.
Auto comment: topic has been updated by lyyllyyl (previous revision, new revision, compare).
push_back invalidates the iterator.
Because you are doing weird [wrong] stuff:
When you append element to deque all others remain unchanged.
But when you append element to vector, vector's memory may be reallocated to become bigger, which usually means, that all elements are moved to other memory region, which means that you are iterating over garbage now.
Auto comment: topic has been updated by lyyllyyl (previous revision, new revision, compare).