我正在尝试编写将链接列表中的字符串按字母顺序排列的代码。这是我写的:
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 :(得分: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()
。
此时,*pos
或pos++
是非法的。
需要修改循环逻辑以避免此类非法指令。