1

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

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

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

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

4

3 回答 3

4

问题出在这个循环中:

while(newData > *pos)
    pos++;

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

要修复您的程序,请按如下方式重写您的循环:

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

PS:另请注意,如果您的意图是以逆字典顺序插入项目(看起来是这样),您很可能希望将pos = myList.begin();语句移动到循环内。for

于 2013-02-14T22:49:24.853 回答
1
while(newData > *pos)
    pos++;

当 时pos++,它可能指向list::end()并取消引用它*pos未定义的行为。

无论如何,您的列表都没有排序,只能 list::push_back

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

然后稍后对其进行排序:

  myList.sort();
于 2013-02-14T22:49:40.637 回答
0

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

在这一点上,进一步*pos或是pos++非法的。

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

于 2013-02-14T22:48:10.307 回答