2009-02-27 74 views
1
std::vector< std::vector<coords> >::iterator iter; 
for(iter = characters.begin(); iter != characters.end(); iter++) 
{ 
    std::vector<coords>* cha = iter; // doesn't work. 
} 

// does work. 
std::vector<coords>* character = &characters.at(0); 
coords* first = &character->at(0); 

而我不明白为什么。它不应该是一个指向容器应该“包含”的类型元素的指针吗?通过迭代器访问另一个矢量内的矢量元素?

任何人都愿意阐明这一点?

通过不工作我的意思是:

error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'std::vector<_Ty> *' 

不使一大堆的道理给我。

回答

6

迭代器是一种可以像指针一样取消引用的类型,即它具有明确的operator*()operator->()。它不一定是一个指针。

因此,如果您想获取矢量的地址,请使用&*iter

3

为了进一步阐明MSN的答案,您可以将迭代器看作是容器中单个项目的包装,但它也有一些智能用于递增(++ iter),递减(++ iter)等。请记住,底层数据结构可能不是连续的内存块,具体取决于容器类型/实现。要访问的实际值,则可以

1)反引用迭代器,例如

Type t = *iter;

2)治疗所述迭代器作为指针到容器类型,例如

iter->someFuncOnTheContainerType();

1

我知道现在很明显(事后看来),但在您的for循环中,您也可以尝试:

std::vector<coords> & cha = * iter; 

此外,不是你要求的,只是FYI,但矢量支持随机访问迭代器。这意味着你也可以这样写:

for(size_t i=0; i<characters.size(); i ++) 

而且,如果你需要转换回一个迭代器,你可以使用:

characters.begin() + i 

这不是做事的C++方式,它打破了通用的迭代哲学,但它有其用途。