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> *'
这对我来说没有多大意义。
答案 0 :(得分:6)
迭代器是一种可以像指针一样被解引用的类型,即它具有明确的operator*()
和operator->()
。它不一定是指针。
如果您想获取向量的地址,请使用&*iter
。
答案 1 :(得分:3)
为了进一步澄清MSN的答案,您可以将迭代器视为容器的单个项目的包装器,但它也有一些智能用于递增(++ iter),递减(++ iter)等。记住,底层数据结构可能不是连续的内存块,具体取决于容器类型/实现。要访问实际值,您可以
1)拒绝迭代器,例如
Type t = *iter;
2)将迭代器视为指向容器类型的指针,例如
iter->someFuncOnTheContainerType();
答案 2 :(得分:1)
我知道现在很明显(事后看来),但在你的for循环中你也可以尝试:
std::vector<coords> & cha = * iter;
此外,不是你要求的,只是FYI,但矢量支持随机访问迭代器。意思是你也可以写:
for( size_t i=0; i<characters.size(); i ++ )
并且,如果您需要转换回迭代器,您可以使用:
characters.begin() + i
这不是C ++的做事方式,它打破了泛型迭代器的理念,但它有其用途。