【问题标题】:How to use find in linkedlist如何在链表中使用查找
【发布时间】:2014-11-23 11:54:28
【问题描述】:

这是我使用 STL 库的代码,我尝试在末尾、中间和前面插入一个节点。为了在中间插入,我想提供插入 after 一个特定节点,而不是通过将迭代器增加 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;
}

谢谢...

【问题讨论】:

  • find 不是成员函数,它是&lt;algorithm&gt; 中定义的模板...使用it= find(l.begin(),l.end(),2);
  • 为什么复制整个列表只是为了打印它的元素?
  • “请帮助为什么 find 功能不起作用:” 欢迎使用 c++ 鲨鱼缸。这一切都超出了这里的任何善意。改进你的问题 1st.__
  • 花一些时间查看std::list<> 提供的所有内容以及其中的示例可能会有很大帮助。罐头algorithms,值得注意的std::find,同样有帮助。
  • 在这些部分中经常出现的问题:“STL”不是编译器附带的 C++ 标准集合类库。 STL 是集合设计的历史来源,最终被修改和修改成为集合类的 C++ 标准库……但它们是两个不同的东西。虽然有些人继续交替使用这些术语,但这样做并不理想。

标签: c++ stl


【解决方案1】:

std::list&lt;&gt; 没有find() 方法。可以使用&lt;algorithm&gt;中声明的标准算法std::find()

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

【讨论】:

    【解决方案2】:

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

    有很多方法可以让你看中这种精神。但更关键的是不要去复制你的数据结构,在你不需要的时候通过值传递它们!

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多