如何在链表中使用find

时间:2014-11-23 03:13:01

标签: c++ stl

这是我使用STL库的代码,我尝试在末尾,中间和前面插入一个节点。对于在中间插入,我想在特定节点之后提供插入,而不是通过将迭代器递增2,因为如果它是一个长列表,我可能不知道如何递增它,< / p>

请帮助为什么找不到功能:

#include <iostream>
#include <list>
#include <string>

using namespace std;

void printlist(list<int> l)
{
    list<int>::iterator it = l.begin();
    for (it; it != l.end(); ++it)
    {
        cout << "printlist function call list items:  " << *it << endl;
    }
}

int main()
{
    list<int> l;
    l.push_back(1);
    l.push_back(2);
    l.push_back(3);
    list<int>::iterator it = l.begin();
    cout << 1 << endl;
    printlist(l);
    l.push_front(0);
    cout << 2 << endl;
    printlist(l);
    it = l.find(l.begin(), l.end(), 2);
    l.insert(it, 25);
    cout << 3 << endl;
    printlist(l);
    return 0;
}

...谢谢

2 个答案:

答案 0 :(得分:4)

std::list<>没有find()方法。您可以使用std::find()中声明的标准算法<algorithm>

it = std::find(l.begin(), l.end(), 2);

答案 1 :(得分:1)

请参阅the answer by @0x499602D2

但是要详细说明@NeilKirk在评论中提出的一个重要观点,你写道:

void printlist(list<int> l)
{
    list<int>::iterator it = l.begin();
    for (it; it != l.end(); ++it)
    {
       cout << "printlist function call list items:  " << *it << endl;
    }
}

请注意,您是按值传递列表l,而不是按引用传递。按值(未设计为使用implicit sharing传递类将进行复制。因此,l将是传递的参数的副本。如果您的列表包含一百万个元素,那么按值传递它将产生一个百万元素的副本。你可以用以下方法解决这个问题:

void printlist(list<int> & l) { ... }

或者,如果您不打算进行任何更改,最好通过以下方式宣布:

void printlist(list<int> const & l) { ... }

此外,C ++ 11有一个基于范围的for,它可以为您提供迭代器开始/结束内容以及自动变量输入:

void printlist(list<int> const & l)
{
    for (auto i : l)
    {
       cout << "printlist function call list items:  " << i << endl;
    }
}

很多方式可以在这种精神中获得幻想。但更重要的是不要制作数据结构的副本,在不需要时按值传递它们!