2012-08-07 47 views
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++; 
    } 
} 

感谢 鲁奇

回答

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

尽管最后的提前部分是正确的,但在循环结尾为O(N^2)时,效率会非常低。 更好地使用迭代器来遍历列表而不是索引 – jcoder 2012-08-07 14:40:59

+0

@JohnB你是对的,我看到问题是孤立的。最好只使用一个迭代器,我会解决这个问题。谢谢。 – mfontanini 2012-08-07 14:43:23

0

此外,请记住,

list1[j] 

不起作用,因为列表中没有索引运算符,因此您必须遍历它。

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

0

正如其他人注意到调用中存在拼写错误(.而不是,)。

但也一旦你过去了list没有一个[]运营商,所以你会发现该部分无法正常工作。您需要使用迭代器遍历最终循环中的列表。

0
int k = *list1[j]; 

那也不会编译。

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

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

你也增加Ĵ两次,你说这个?

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