2011-04-27 65 views
1

我循環通過兩個STL列表(L1,L2),像這樣:取消引用C++ STL列表迭代器

list<int>::const_iterator itr1 = L1.begin(); 
list<int>::const_iterator itr2 = L2.begin(); 

for (itr1; itr1 != L1.end(); itr1++) { 
    if (*itr1 < *itr2) { 
    //some code 
    } 

} 

它編譯罰款,但是當我運行它,它說:「表達式:列表迭代器不dereferencable」

現在在課上,我們製作了一個STL列表的模擬版本,我們編寫了自己的STL列表,並且我們重載了*運算符來取消引用迭代器。但是,顯然這不是在這裏工作。

如何取消引用迭代器,或者如果STL列表以不同的方式執行,它是如何執行的。我通過這個看:

http://www.sgi.com/tech/stl/List.html

文檔和似乎沒有找到任何接受會員「引用」,但仍然沒有看到如何引用什麼的迭代器指向,除非它是第一個或最後一個列表的一部分。

任何人都知道這裏發生了什麼?謝謝

這裏是一個引擎收錄:

http://pastebin.com/YRddqjmN

+0

我做了我最好的猜測答案,但是當我編譯上面的代碼只是正常工作。您可能需要添加操作系統和編譯器詳細信息。 – 2011-04-27 01:15:39

+0

發佈一些完整的代碼來顯示問題的好地方是http://pastebin.com和http://codepad.org – 2011-04-27 01:18:11

+0

例如,我從此做出了一個程序,並將它放在鍵盤上:http:// codepad .org/JgMBNAiW – 2011-04-27 01:22:04

回答

2
while (*itr2 < *itr1) { 
    itr2++; 
} 

該代碼沒有檢查是否運行在L2的末尾。也許增加支票itr2 != L2.end()

+0

你是對的我忘了檢查,謝謝並感謝其他人,所有的答案幫助! – Ben 2011-04-27 01:39:14

+0

你不要讓它繼續前進。這可以嗎? – geekazoid 2011-04-27 02:01:01

3

我的猜測:

L2是空的,所以L2.begin()相同L2.end()

這意味着L2.begin()返回一個不可引用的迭代器,因此調用未定義的行爲。

3

這個(實現特定的)消息向我建議你解除了一個無效的迭代器。這與語法/編譯時語義沒有任何關係,所以你的編譯器沒有抱怨就不足爲奇了。但是請注意,迭代器確實具有運行時語義:在這種情況下,我打賭用空的L2列表調用代碼,以便itr2 == L2.end()。這意味着*itr2會導致未定義的行爲。幸運的是,這似乎觸發了一個錯誤消息,而不是放在你的臉上。

0

只要標準列表迭代器在您列表的範圍內,即[list.begin(),list.end())被清除,而您的列表不爲空。

0

其他答案是正確的,因爲有兩個錯誤,壞列表迭代器被解引用。看你的引擎收錄,

這種情況是倒退:

if ((*itr1 == *itr2) && (itr2 != L2.end())) { 

應該

if ((itr2 != L2.end()) && (*itr1 == *itr2)) { 

,以檢查itr2是使用它之前有效。此外,第一條件

if (L1.empty() && L2.empty()) { 
      cout << "Returning an empty list because the two arugment lists were empty\n\n"; 

應該是脫節:

if (L1.empty() || L2.empty()) { 
      cout << "Returning an empty list because at least one of the two argument lists was empty\n\n"; 

,但它甚至不是真的有必要。

(哦,是你知道的set_intersection,這是標準庫的一部分?)