0

嗨,我从以下代码中收到编译错误。我无法弄清楚:

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

代码:

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

main()
{
    std::list<int> clist;
    for (int i =0; i<10; i++)
    {
        clist.push_back(i);
    }

    std::list<std::list<int>::const_iterator> list1;

    std::list<int>::iterator itr1;
    itr1 = std::find(clist.begin().clist.end(),1);
    std::list<int>::iterator itr2 ;

    itr2 = std::find(clist.begin().clist.end(),7);

    list1.push_back(itr1);
    list1.push_back(itr2);

    for(int j =0; j< list1.size(); j++)
    {
       int k = *list1[j];
       std::cout << "cvalue " << k <<std::endl;
       j++;
     }
}

谢谢鲁奇

4

4 回答 4

3

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

itr1 = std::find(clist.begin().clist.end(),1);
                              ^

它应该是这样的:

itr1 = std::find(clist.begin(), clist.end(),1);

你在两次调用中都犯了这个错误std::find

此外,您尝试operator[]在列表中使用,这将不起作用。代替:

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;
}
于 2012-08-07T14:19:12.527 回答
0
int k = *list1[j];

那也不会编译。

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

int k = *(find(clist.begin(), clist.end(), j));

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

for(int j =0; j< list1.size(); j++) //here
{
   int k = *list1[j];
   std::cout << "cvalue " << k <<std::endl;
   j++; //and here?
}
于 2012-08-07T14:26:22.117 回答
0

此外,请记住

list1[j]

不起作用,因为列表没有索引运算符,因此您必须对其进行迭代。

建议:使用 astd::vector< int >而不是 a std::list< int >

于 2012-08-07T14:21:19.200 回答
0

正如其他人所指出的那样,find调用中有一个错字(.而不是,)。

但是,一旦您过去list没有[]操作员,您就会发现该部分也无法正常工作。您需要使用迭代器在最终循环中遍历列表。

于 2012-08-07T14:21:26.873 回答