2012-10-23 30 views
1

我不明白我測試過的這個非常簡單的列表的問題在哪裏。這個想法是讓我的位置在列表中的項目。 我通常知道我不會用列表來做到這一點。 然而,這個工作當我設置item = 11item = 12item = 13(輸出將分別at position {1, 2, 3} there's the item {11, 12, 13}),但是當我設置item = 10,因爲輸出是at position 0 there's the item 6這是行不通的。這個簡單的std :: list中的錯誤在哪裏?

int main(void) 
{ 
    list<int> L; 
    L.push_back(10); 
    L.push_back(11); 
    L.push_back(12); 
    L.push_back(13); 

    int item = 10; 
    int pos; 

    list<int>::iterator it = moveToItem(item, L, pos); 

    cout << "at position " << pos << " there's the item " << *it; 
} 

list<int>::iterator moveToItem(int item, list<int> L, int& pos) 
{ 
    pos = 0; 
    list<int>::iterator it = L.begin(); 

    while(*it != item) 
    { 
     it++; 
     pos++; 
    } 
    return it; 
} 

回答

7

moveToItem()被稱爲所以返回的迭代器是指已被破壞一個list的項目正在取得列表L的副本。通過引用傳遞list代替:

list<int>::iterator moveToItem(int item, list<int>& L, int& pos) 
               //^ 

你也應該防止去過去的while條件listend(),解引用it之前。

如果這不是一個練習考慮使用STL算法std::find()std::distance()代替:

#include <iterator> 
#include <algorithm> 

std::list<int>::iterator it = std::find(L.begin(), L.end(), 41); 
if (it != L.end()) 
{ 
    std::cout << "at position " 
       << std::distance(L.begin(), it) 
       << " there's the item " 
       << *it 
       << "\n"; 
} 
+0

謝謝,就是這樣! :) – FerranMG

0

打電話給你發名單的list<int>::iterator moveToItem(int item, list<int> L, int& pos)當前副本的時候你應該通過引用到列表中。

所以你的方法應該是list<int>::iterator moveToItem(int item, list<int>& L, int& pos)。你可以保持你的方法的正文一樣。

0

您正在按值查看列表。因此,返回的迭代器是該函數的本地參數L的迭代器,因此一旦函數返回(並且L被破壞)就無效。你應該採取L參考:

list<int>::iterator moveToItem(int item, list<int> &L, int& pos) 

性能方面它是不是最好的主意,採取這樣的可能大數據結構由值列表,反正。

相關問題