c++ - 这个简单的 std::list 中的错误在哪里?

标签 c++ list stl

我不明白我一直在测试的这个非常简单的列表的问题在哪里。这个想法是在列表中的位置 i 获取项目。 我知道通常我不会使用列表来做到这一点。 但是,这在我设置 item = 11item = 12item = 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/

相关文章:

c++ - std::unordered_set<Foo> 作为类 Foo 的成员

c++ - 带文件路径的 std::string 到 str::string.c_str() 转换中的有趣问题

c++ - std::swap 只读引用的错误分配

c++ - set.upper_bound()和upper_bound(set.begin(),set.end())STL之间的区别

c++ - Qt。将项目从 Linux 移动到 Windows。为什么 Qt creator 返回错误 c1083 can't open directory or file?

基于列表项的文本值的 css 样式

list - 如何在Flex 4的Spark List控件中处理click事件

c - 按字母顺序排序 c 中的列表

c++ - 优化开关——它们到底做了什么?

c++ - 带有Qt 4.8.5的Netbeans 7.3.1-无法编译