Ошибка std :: copy, «невозможно найти векторный итератор после завершения» - PullRequest
5 голосов
/ 02 июня 2019

Я собрал этот тестовый пример, который воспроизводит условия и проблемы, которые я получаю в большем коде.На самом деле мне нужно скопировать из массива C структуры POD, но я бы хотел, чтобы местом назначения был вектор, чтобы он мог самостоятельно обрабатывать удаление копии.

TEST_METHOD(std_copy)
{
    struct W { long a; int b; char c; char d; };
    W block[1] = { { 15, 42, 'D', 'X' } };
    std::vector<W> dest;
    dest.reserve(1);
    std::copy(block, block+1, dest.begin());
    Assert::AreEqual(42, dest[0].b);
}

Утверждение "не можетитератор поиска вектора после завершения ", кажется, происходит в вызове dest.begin(), что для меня не имеет смысла.Я уверен, что просто упускаю очевидную деталь, но что это?

1 Ответ

6 голосов
/ 02 июня 2019

Как говорится в сообщении об ошибке, вы выходите за границы вектора.

Учитывая, что std::copy(block, block+1, dest.begin());, dest должен содержать по крайней мере такое же количество элементов (то есть один элемент здесь), но на самом деле он пуст.

Вы можете использовать resize вместо reserve,

std::vector<W> dest;
dest.resize(1);
std::copy(block, block+1, dest.begin());

Или просто

std::vector<W> dest(1);
std::copy(block, block+1, dest.begin());

Или используйте std::back_inserter, чтобы получить std::back_insert_iterator.

Функция-контейнер push_back() вызывается всякий раз, когда назначается итератор (независимо от того, разыменован он или нет).

std::vector<W> dest;
dest.reserve(1);
std::copy(block, block+1, std::back_inserter(dest));
...