通过迭代器访问另一个向量内的向量元素?

Posted

技术标签:

【中文标题】通过迭代器访问另一个向量内的向量元素?【英文标题】:Accessing vector elements inside another vector through an iterator? 【发布时间】:2009-02-27 05:30:32 【问题描述】:
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);

我不明白为什么。 iter 不应该是指向它的容器应该“包含”的类型的元素的指针吗?

有人愿意解释一下吗?

我的意思是不起作用:

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

这对我来说没有多大意义。

【问题讨论】:

【参考方案1】:

迭代器是一种可以像指针一样被取消引用的类型,即它有一个显式的operator*()operator-&gt;()。它不一定是指针。

如果你想获取向量的地址,请使用&amp;*iter

【讨论】:

【参考方案2】:

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

1) 取消对迭代器的引用,例如

Type t = *iter;

2) 将迭代器视为指向容器类型的指针,例如

iter-&gt;someFuncOnTheContainerType();

【讨论】:

【参考方案3】:

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

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

另外,不是您要求的,仅供参考,但向量支持随机访问迭代器。意思是你也可以写:

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

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

characters.begin() + i

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

【讨论】:

以上是关于通过迭代器访问另一个向量内的向量元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过迭代器访问向量中的嵌套对?

使用向量迭代器时的 EXC_BAD_ACCESS?

使用迭代器 C++ 删除对象类型的向量元素

使用迭代器查找向量的中间元素 - C++

将迭代器解引用到 2D 向量并将其值分配给另一个 2D 向量

对于 C++ Random Access Iterator(向量迭代器),迭代器之间的差异是如何计算的?