2013-02-14 182 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