lyyllyyl's blog

By lyyllyyl, history, 8 years ago, In English

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.

  • Vote: I like it
  • -8
  • Vote: I do not like it

»
8 years ago, # |
  Vote: I like it 0 Vote: I do not like it

Auto comment: topic has been updated by lyyllyyl (previous revision, new revision, compare).

»
8 years ago, # |
  Vote: I like it +15 Vote: I do not like it

push_back invalidates the iterator.

»
8 years ago, # |
Rev. 2   Vote: I like it +10 Vote: I do not like it

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.

»
8 years ago, # |
  Vote: I like it +5 Vote: I do not like it

Auto comment: topic has been updated by lyyllyyl (previous revision, new revision, compare).