2013-02-14 80 views
1

我正在嘗試編寫將字符串按字母順序排列的鏈接列表。以下是我已經寫了: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"); 
} 

此代碼編譯很好,但我得到一個錯誤,當我運行它的列表迭代器不提領。

我很新的鏈接列表和迭代器,所以我真的不知道如何解決它。任何幫助將不勝感激!

+0

除了答案,它不會傷害轉'正位++'到較少浪費的'++ pos'。 – 2016-11-25 15:25:22

回答

4

的問題是在這個週期:

while(newData > *pos) 
    pos++; 

根據您的輸入,您可能會不斷增加pos直到到達列表的末尾。此時,在檢查您的while循環的條件時解除引用會導致未定義的行爲

要修復程序,改寫你的循環如下:

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

PS:另請注意,您很可能希望移動pos = myList.begin();語句for循環內,如果你的目的是要插入項目按逆序詞典順序排列(就像它似乎是這樣)。

+1

......你還必須在'for'循環中移動'pos = myList.begin();'。 – us2012 2013-02-14 22:54:30

+0

@ us2012:最有可能的就是OP想要的東西,事實上(儘管離開它不會導致UB)。但是我會將其添加到我的答案中,謝謝。 – 2013-02-14 22:56:47

0

在做pos++時,您可能會到達列表的末尾,即pos == myList.end()

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

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

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(); 
+0

看來,OP想維護一個排序列表。 – Arun 2013-02-14 22:53:44

+0

他的列表順序取決於輸入 – billz 2013-02-14 22:54:37