2013-02-14 2 views
1

Я пытаюсь написать код, который будет алфавитными строками в связанном списке. Вот что я написал:C++ «list iterator not dereferenceable» error

void main() { 
list<string> myList; 
list<string>::iterator pos; 

string newData; 
myList.push_back("Anna"); 

pos = myList.begin(); 

for (int i = 0; i < 5; i++){ 
    cin >> newData; 
    while(newData > *pos) 
     pos++; 

    myList.insert(pos, newData); 
} 

system("pause"); 
} 

Этот код компилируется нормально, но я получаю сообщение об ошибке, что список итератор не разыменовываемое, когда я запускаю его.

Я очень новый со связанными списками и итераторами, поэтому я действительно не знаю, как это исправить. Любая помощь будет принята с благодарностью!

+0

В дополнение к ответам, не мешало бы, чтобы переключить ' pos ++ 'к менее расточительному' ++ pos'. –

ответ

4

Проблема заключается в этом цикле:

while(newData > *pos) 
    pos++; 

В зависимости от вашего входа, вы можете продолжать увеличивать pos, пока не будет достигнут конец списка. В этот момент разыменование его при проверке состояния вашего цикла while вызывает Неопределенное поведение.

Чтобы исправить программу, переписать цикл следующим образом:

while ((pos != myList.end()) && (newData > *pos)) 
{ 
    pos++; 
} 

PS: Также обратите внимание, что вы, скорее всего, хотят, чтобы переместить pos = myList.begin(); заявление внутри цикла for, если ваше намерение состоит в том, чтобы вставить элементы в обратном лексикографическом порядке (как представляется).

+1

... вам также нужно переместить 'pos = myList.begin();' внутри цикла 'for'. – us2012

+0

@ us2012: Скорее всего, это то, чего захочет OP, действительно (хотя оставить его там не вызовет UB). Но я добавлю это к моему ответу, спасибо. –

0

Выполняя pos++, вы можете добраться до конца списка, то есть pos == myList.end().

В этот момент дополнительно *pos или pos++ является незаконным.

Логику цикла необходимо пересмотреть, чтобы избежать таких незаконных инструкций.

1
while(newData > *pos) 
    pos++; 

Когда pos++, он может указывает на list::end() и разыменовать ней *pos является неопределенное поведение.

Ваш список не отсортирован в любом случае, можно просто перечислить :: push_back

for (int i = 0; i < 5; i++){ 
    cin >> newData; 
    myList.push_back(newData); 
} 

Тогда сортировать позже:

myList.sort(); 
+0

Кажется, что OP хочет сохранить отсортированный список. – Arun

+0

Его список заказов зависит от ввода – billz