C++ STL copy_backward вопрос

int main () {
  vector<int> myvector;
  vector<int>::iterator it;

  // set some values:
  for (int i=1; i<=5; i++)
    myvector.push_back(i*10);          // myvector: 10 20 30 40 50

  myvector.resize(myvector.size()+3);  // allocate space for 3 more elements

  copy_backward ( myvector.begin(), myvector.begin()+5, myvector.end() );

  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;

  cout << endl;

  return 0;
}

Почему вывод "myvector содержит: 10 20 30 10 20 30 40 50"

почему не "30 40 50 10 20 30 40 50"

Реализация copy_backward находится здесь:

template<class BidirectionalIterator1, class BidirectionalIterator2>
  BidirectionalIterator2 copy_backward ( BidirectionalIterator1 first,
                                         BidirectionalIterator1 last,
                                         BidirectionalIterator2 result )
{
  while (last!=first) *(--result) = *(--last);
  return result;
}

Так неловко. Спасибо за твою помощь.

2 ответа

Решение

Этот вывод выглядит правильно для меня в зависимости от способа написания кода. Вы копируете из одного и того же вектора. Вы копируете из [начало, начало +5] (10 20 30 40 50) и копируете в [конец, конец-5]. Таким образом, 10 20 30 [10 20 30 40 50] - правильный выход для этого кода. Первые 3 элемента нетронуты.

Если вы хотите скопировать что-то в обратном направлении, используйте обратные итераторы: rbegin() а также rend(), Тогда просто используйте обычный std::copy,

Другие вопросы по тегам