Почему я получаю это утверждение отладки не удалось? Выражение: итератор списка не разыменовывается

Я пробую этот пример в (переведенной на голландский) книге Бьярна Страуструпа (C ++):

#include <vector>
#include <list>
#include "complex.h"
complex ac[200];
std::vector<complex> vc;
std::list<complex> l;

template<class In, class Out> void Copy(In from, In too_far, Out to) {
while(from != too_far) {
*to = *from;
++to;
++from;
}
}

void g(std::vector<complex>& vc , std::list<complex>& lc) {
Copy(&ac[0], &ac[200], lc.begin());           // generates debug error
Copy(lc.begin(), lc.end(), vc.begin());       // also generates debug error
}

void f() {
ac[0] = complex(10,20);
g(vc, l);
}

int main () {
f();
}

** Компиляция и связывание прошло успешно (0 ошибок / предупреждений) **

Но во время выполнения я получаю эту ошибку:

Ошибка отладки!

Программа: путь к exe

file: \ program files \ ms vs studio 10.0 \ vc \ include \ list

Линия: 207

Выражение: итератор списка не разыменовывается

Для получения информации о том, как ваша программа может вызвать ошибку подтверждения, см. Документацию по утверждениям в Visual C ++.
(Нажмите повторить, чтобы отладить приложение)

2

Решение

Оба из следующих ошибочных:

Copy(&ac[0], &ac[200], lc.begin());           // generates debug error
Copy(lc.begin(), lc.end(), vc.begin());       // also generates debug error

Ваш Copy() функция перезаписывает элементы, начиная с итератора, указанного в качестве третьего аргумента. Поэтому диапазон назначения должен быть действительным и достаточно большим, чтобы вместить все копируемые элементы. ни lc ни vc удовлетворить это, поэтому поведение вашего кода не определено.

Один из способов исправить ваш код — использовать std::back_inserter.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]