我不明白我一直在测试的这个非常简单的列表的问题在哪里。这个想法是在列表中的位置 i 获取项目。
我知道通常我不会使用列表来做到这一点。
但是,这在我设置 item = 11
、item = 12
和 item = 13
时有效(输出分别为 at位置 {1, 2, 3} 有项目 {11, 12, 13}
),但是当我设置 item = 10
时它不起作用,因为输出是 在位置 0 处有项目 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;
}
最佳答案
当 moveToItem()
被调用时,正在创建列表 L
的拷贝,因此返回的迭代器指的是 list
的一个项目> 已被破坏。改为通过引用传递 list
:
list<int>::iterator moveToItem(int item, list<int>& L, int& pos)
//^
在取消引用它
.
如果这不是练习,请考虑使用 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";
}
关于c++ - 这个简单的 std::list 中的错误在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13026900/