这是我使用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;
}
答案 0 :(得分:4)
std::list<>
没有find()
方法。您可以使用std::find()
中声明的标准算法<algorithm>
:
it = std::find(l.begin(), l.end(), 2);
答案 1 :(得分:1)
但是要详细说明@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;
}
}
很多方式可以在这种精神中获得幻想。但更重要的是不要制作数据结构的副本,在不需要时按值传递它们!