2009-12-12 112 views
2

我有一個vector<list<customClass> >C++迭代混亂

我有一個迭代器vector<list<customClass> >::const_iterator x

當我試圖訪問customClass的成員,像這樣:

x[0]->somefunc(),我得到一個非指針類型的錯誤/未找到。

+0

尋找一個實際的解決方案也:) – 2009-12-12 04:26:04

回答

4

這是一個完整的工作片段。要回答你的問題,帶註釋[1]的行顯示瞭如何解引用const_iterator,而註釋[2]顯示瞭如何使用操作符[]解引用。

#include <vector> 
#include <list> 
#include <iostream> 
class Foo 
{ 
public: 
    void hello() const 
    { 
     std::cout << "hello - type any key to continue\n"; 
     getchar(); 
    } 

    void func(std::vector<std::list<Foo> > const& vec) 
    { 
     std::vector<std::list<Foo> >::const_iterator qVec = vec.begin(); 
     qVec->front().hello(); // [1] dereference const_iterator 
    } 
}; 
int main(int argc, char* argv[]) 
{ 
    std::list<Foo> list; 
    Foo foo; 
    list.push_front(foo); 
    std::vector<std::list<Foo> > vec; 
    vec.push_back(list); 

    foo.func(vec); 
    vec[0].front().hello(); // [2] dereference vector using [] 
} 
2

迭代器類不提供operator []的,因此你不能用它這樣的。你應該把它作爲X-> somefunc()

+0

但是,這不會指向實際的類。有沒有指向列表,但指向類 – 2009-12-12 04:14:08

+1

因爲你必須使用兩個層級的間接。從第一個迭代器獲取列表對象。然後得到迭代器中的列表對象,解引用這個迭代器取得SomeClass的對象 – Naveen 2009-12-12 04:26:33

+0

因爲x是一個向量的迭代器,它是一種隨機訪問迭代器。同樣,它提供了operator []。但是,結果是std :: list的常量左值,它不提供「 - >」。 – sellibitze 2009-12-12 08:15:36

2

x是一個迭代器,它就像一個指針 - 它指向一個列表。所以你只能使用std :: list成員的函數。

2

的常量迭代器將間接引用到list<customClass>對象不是一個指針列表。你必須訪問索引在該列表中的類...

忽略錯誤檢查:

(*x)[0].somefunc() 
+0

stl清單不要超載索引運算符 – csj 2009-12-12 05:24:24

+0

啊,謝謝你的更正。 – 2009-12-12 06:08:57

0

,如果你想直接訪問的列表和向量類已經實現了[]操作,所以直接訪問它:vectorObj [x] .someFunc();

迭代器,通過該列表會(迭代它就像顧名思義),將它用於。

4

迭代器解引用到列表中。如果你想訪問列表中的一個對象,那麼你將不得不使用列表方法來做到這一點。但是,由於stl列表不會超載索引運算符,因此這不是一個有效的選項。

這將讓你打電話somefunc的第一個元素列表:

(*x).front().somefunc(); 

在另一方面,如果你想爲你的列表中的迭代器,你可以做這樣的事情:

list<customClass>::const_iterator listIterator = (*x).begin(); 
listIterator->somefunc();