C ++“list iterator not dereferenceable”错误

时间:2013-02-14 22:44:03

标签: c++ stl visual-studio-2012 iterator

我正在尝试编写将链接列表中的字符串按字母顺序排列的代码。这是我写的:

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");
}

这段代码编译得很好但是我得到一个错误,当我运行它时,列表迭代器不能解除引用。

我对链表和迭代器很新,所以我真的不知道如何修复它。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:4)

问题出现在这个循环中:

while(newData > *pos)
    pos++;

根据您的输入,您可能会不断增加pos,直至到达列表末尾。此时,在检查while循环的条件时取消引用它会导致未定义的行为

要修复程序,请按以下步骤重写循环:

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

PS:另请注意,如果您打算以反向字典顺序插入项目(如图所示),您最有可能想要在pos = myList.begin();循环中移动for语句。

答案 1 :(得分: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();

答案 2 :(得分:0)

在执行pos++时,您可能会到达列表的末尾,即pos == myList.end()

此时,*pospos++是非法的。

需要修改循环逻辑以避免此类非法指令。