这个简单的std :: list中的bug在哪里?

时间:2012-10-23 09:03:33

标签: c++ list stl

我无法理解这个我一直在测试的非常简单的列表的问题。想法是将项目放在列表中的位置i。 我知道我通常不会使用列表来做到这一点。 但是,当我设置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

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;
}

3 个答案:

答案 0 :(得分:7)

在调用L时正在创建列表moveToItem()的副本,因此返回的迭代器指的是已被破坏的list项。改为通过引用传递list

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

在取消引用end()之前,您还应该防止超过list条件while的{​​{1}}。

如果这不是练习,请考虑使用STL算法std::find()std::distance()

it

答案 1 :(得分:0)

在调用list<int>::iterator moveToItem(int item, list<int> L, int& pos)目前的列表副本时,您应该将引用传递给您的列表。

所以你的方法应该是list<int>::iterator moveToItem(int item, list<int>& L, int& pos)。您可以保持方法的主体相同。

答案 2 :(得分:0)

您按列表获取列表。因此,返回的迭代器是函数的本地L参数的迭代器,因此一旦函数返回(并且L被销毁)就无效。您应该参考L

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

在性能方面,无论如何,将这样一个可能很大的数据结构作为列表按值来表达并不是最好的主意。