Вдохновленный этот вопрос, спрашивая, как добавить вектор к себе, моя первая мысль была следующей (и да, я понимаю, что insert
- лучший вариант сейчас):
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector<int> vec {1, 2, 3};
std::copy (std::begin (vec), std::end (vec), std::back_inserter (vec));
for (const auto &v : vec)
std::cout << v << ' ';
}
Однако это печатает:
1 2 3 1 * 3
* Каждый раз, когда запускается программа, * - это другое число. Тот факт, что он заменяет только 2, является своеобразным, и если на самом деле есть объяснение, мне было бы интересно его услышать. Продолжая, если я добавляю к другому вектору (копию оригинала), он выводит правильно. Он также выводится правильно, если я добавлю следующую строку перед copy
one:
vec.reserve (2 * vec.size());
Я был под впечатлением std::back_inserter
был безопасным способом добавления элементов на конец контейнера, несмотря на то, что он не резервировал память заранее. Если мое понимание правильное, что случилось с копировальной линией?
Я предполагаю, что это не связано с компилятором, но я использую GCC 4.7.1.