C++ 在std::列表中查找

C++ 在std::列表中查找,c++,stl,stdlist,C++,Stl,Stdlist,嗨,我从下面的代码中得到编译错误。我想不出: g++ stl_list_1.cc stl_list_1.cc: In function \u2018int main()\u2019: stl_list_1.cc:16: error: \u2018struct std::_List_iterator<int>\u2019 has no member named \u2018clist\u2019 stl_list_1.cc:19: error: \u2018struct std::_L

嗨,我从下面的代码中得到编译错误。我想不出:

g++ stl_list_1.cc
stl_list_1.cc: In function \u2018int main()\u2019:
stl_list_1.cc:16: error: \u2018struct std::_List_iterator<int>\u2019 has no member named \u2018clist\u2019
stl_list_1.cc:19: error: \u2018struct std::_List_iterator<int>\u2019 has no member named \u2018clist\u2019
stl_list_1.cc:25: error: no match for call to \u2018(std::list<std::_List_const_iterator<int>, std::allocator<std::_List_const_iterator<int> > >) (int&)\u2019
g++stl\u list\u 1.cc
stl_list_1.cc:在函数\u2018int main()中\u2019:
stl_list_1.cc:16:错误:\u2018struct std::_list_迭代器\u2019没有名为\u2018clist\u2019的成员
stl_list_1.cc:19:错误:\u2018struct std::_list_迭代器\u2019没有名为\u2018clist\u2019的成员
stl_list_1.cc:25:错误:调用\u2018(std::list)(int&)\u2019不匹配
代码:

#包括
#包括
#包括
使用名称空间std;
main()
{
std::列表clist;

对于(int i=0;i这是一个打字错误,您使用了点而不是逗号:

itr1 = std::find(clist.begin().clist.end(),1);
                              ^
应该是这样的:

itr1 = std::find(clist.begin(), clist.end(),1);
您在对
std::find
的两个调用中都犯了这个错误

此外,您试图在列表上使用
运算符[]
,但这不起作用。请改为:

int k = *list1[j];
您可以使用:

itr1 = list1.begin();
std::advance(itr1, j);
int k = *itr1;
正如JohnB提到的,上面的代码效率很低。孤立的,这是一样的,但是由于您在循环中使用它,因此最好只使用列表迭代器来执行迭代:

for(itr1 = list1.begin(); itr1 != list1.end(); ++itr1)
{
   int k = *itr1;
   std::cout << "cvalue " << k <<std::endl;
}
for(itr1=list1.begin();itr1!=list1.end();++itr1)
{
int k=*itr1;

std::cout这是一个打字错误,您使用了点而不是逗号:

itr1 = std::find(clist.begin().clist.end(),1);
                              ^
应该是这样的:

itr1 = std::find(clist.begin(), clist.end(),1);
您在对
std::find
的两个调用中都犯了这个错误

此外,您试图在列表上使用
运算符[]
,但这不起作用。请改为:

int k = *list1[j];
您可以使用:

itr1 = list1.begin();
std::advance(itr1, j);
int k = *itr1;
正如JohnB提到的,上面的代码效率很低。孤立的,这是一样的,但是由于您在循环中使用它,因此最好只使用列表迭代器来执行迭代:

for(itr1 = list1.begin(); itr1 != list1.end(); ++itr1)
{
   int k = *itr1;
   std::cout << "cvalue " << k <<std::endl;
}
for(itr1=list1.begin();itr1!=list1.end();++itr1)
{
int k=*itr1;

另外,请记住

list1[j]
不起作用,因为列表没有索引运算符,所以必须对其进行迭代


建议:使用
std::vector
代替
std::list
此外,请记住

list1[j]
不起作用,因为列表没有索引运算符,所以必须对其进行迭代


建议:使用
std::vector
代替
std::list

,因为其他人注意到在
find
调用中有输入错误(
代替


但是,一旦你通过了
列表
没有
[]
操作符,你就会发现该部分也不能正常工作。你需要使用迭代器在最后一个循环中循环列表。

正如其他人指出的那样,
查找
调用(
而不是
)中有一个打字错误

int k = *list1[j];
但是,一旦您通过了该
列表
没有
[]
操作符,您就会发现该部分也无法正常工作。您需要使用迭代器在最终循环中循环列表

int k = *list1[j];
这也不会编译

也许像这样的事情可能(不检查任何安全性等,这是一个垃圾的方式,但只是显示)

你也增加j两次,你是这个意思吗

for(int j =0; j< list1.size(); j++) //here
{
   int k = *list1[j];
   std::cout << "cvalue " << k <<std::endl;
   j++; //and here?
}
for(int j=0;j
也许像这样的事情可能(不检查任何安全性等,这是一个垃圾的方式,但只是显示)

你也增加j两次,你是这个意思吗

for(int j =0; j< list1.size(); j++) //here
{
   int k = *list1[j];
   std::cout << "cvalue " << k <<std::endl;
   j++; //and here?
}
for(int j=0;jstd::cout虽然最后的高级部分是正确的,但在循环中它将非常低效,最终成为O(N^2)。最好使用迭代器一次遍历列表,而不是使用index@JohnB你说得对,我发现问题是孤立的。最好只使用迭代器,我会解决这个问题。谢谢。虽然最后的高级部分是正确的,但在循环中效率会非常低,最终变成O(N^2)。最好使用迭代器一次遍历列表,而不是使用index@JohnB你说得对,我发现问题是孤立的。最好只使用迭代器,我会解决的。谢谢。