2012-08-07 44 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? 
}