如何使用在链接列表中查找

How to use find in linkedlist

本文关键字:查找 列表 链接 何使用      更新时间:2023-10-16

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

请帮助为什么查找功能不起作用:

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

谢谢。。。

std::list<>没有

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

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

按@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按值传递列表,而不是按引用传递列表。 按值传递类(尚未设计为使用隐式共享)将创建副本。 因此,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;
    }
}

有很多方法可以花哨这种精神。 但更关键的事情不是复制您的数据结构,在不需要的时候按值传递它们!