Я смотрел разговор это (включая временную метку). И тут докладчик говорит, что для внесения этой модификации
{1,2,3,4,5,6,7,8,9,10} -> {1,2,3,1,2,3,4,5,9,10}
он использовал std::copy
, и он разбился, поэтому вам следует использовать вместо него std::copy_backward
.
Но по моему опыту все наоборот.
https://wandbox.org/permlink/hDjMhubAg1vb1KZz
int main()
{
std::vector<int> v {1,2,3,4,5,6,7,8,9,10};
std::copy(v.begin(), v.begin()+5, v.begin()+3);
for(const auto& i : v)
std::cout<<i<<',';
}
Это прекрасно работает. А с std::copy_backward
вылетает.
Я что-то слепой? Или это спикер ошибается?
Обновлено: Моя ошибка заключалась в том, чтобы предположить, что обе функции имеют одинаковую интерпретацию аргументов. С std::copy_backward
мне следовало использовать v.end()-2
вместо v.begin()+3
.
Тот факт, что он не разбился, ничего не значит. Согласно Стандарту, std::copy
не определен, если целевой итератор находится в диапазоне [первый, последний) - и это ваш случай. Как мы все знаем, отсутствие сбоев - это только один возможных проявлений неопределенного поведения.
Чтобы узнать, почему ваш std::copy_backwards
выходит из строя, нам нужно увидеть код, который его использует. У меня есть подозрение, что вы использовали его неправильно (это замена нет для std::copy
, вам нужно соответствующим образом изменить аргументы).
@ FrançoisAndrieux относится к версии, использующей std::copy
, которая не определена.
Если итератор вывода находится между двумя итераторами ввода, поведение не определено. То, что на вашем примере это сработало, - случайность.
В std::copy_backward
третий параметр является итератором для выходного элемента последний. Итак, вам нужно изменить свой пример на:
std::copy_backward(v.begin(), v.begin()+5, v.begin()+8);
std::copty_backward
принимает итератор к элементу последний для копирования. Итак,v.begin()+8
.