2009-12-12 101 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();