[英]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");
}
這段代碼可以很好地編譯,但是在運行時出現列表迭代器不可取消的錯誤。
我對鏈表和迭代器非常陌生,所以我真的不知道如何解決它。 任何幫助將不勝感激!
問題出在這個周期:
while(newData > *pos)
pos++;
根據您的輸入,您可能會不斷增加pos
直到到達列表末尾。 到那時,在檢查while
循環條件時取消引用它會導致Undefined Behavior 。
要修復程序,請按照以下步驟重寫循環:
while ((pos != myList.end()) && (newData > *pos))
{
pos++;
}
PS:還請注意,您最有可能希望移動pos = myList.begin();
for
循環中的語句,如果您打算按反字典順序插入項目(看起來如此)。
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();
在執行pos++
,您可能會到達列表的末尾,即pos == myList.end()
。
此時,進一步的*pos
或pos++
是非法的。
需要修改循環邏輯以避免此類非法指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.