簡體   English   中英

C ++“列表迭代器不可取消引用”錯誤

[英]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()

此時,進一步的*pospos++是非法的。

需要修改循環邏輯以避免此類非法指令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM