我无法理解这个我一直在测试的非常简单的列表的问题。想法是将项目放在列表中的位置i。
我知道我通常不会使用列表来做到这一点。
但是,当我设置item = 11
,item = 12
和item = 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;
}
答案 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)
在性能方面,无论如何,将这样一个可能很大的数据结构作为列表按值来表达并不是最好的主意。