迭代器可以在 C++ 中的向量之间共享吗?

Posted

技术标签:

【中文标题】迭代器可以在 C++ 中的向量之间共享吗?【英文标题】:Can the iterator be shared between vectors in C++? 【发布时间】:2013-07-02 18:34:23 【问题描述】:

在 C++ 中,如果我有两个数组 a[10] and b[10],我可以引入一个索引 i 可用于两个数组都指向第 (i+1) 个元素 a[i] and b[i]。迭代器是否也可以共享,或者我需要执行以下操作:

vector<int> a;
vector<int> b;    //assume both are initiated and same
vector<int>::iterator i;    //assume program know i=10 and *i=20 in vector a 
vector<int>::iterator j = b.begin();

for(;j != b.end();j++)
    if(*j == *i)
        break;
    

然后我得到指向相同位置但在向量 b 中的迭代器 j?我可以简单地知道i在a中的位置然后j=b.begin()+pos(i)

【问题讨论】:

迭代器“等于十”是什么意思? 目前还不清楚意图是什么。虽然如前所述,明确的答案是否定的,但您真正问题的答案可能是肯定的 【参考方案1】:

标准 C++ 库中的迭代器是根据指针而不是索引建模的。就像指针不能在多个数组之间共享一样,迭代器也不能在向量或其他集合之间共享。

如果您需要并行迭代多个向量,您可以使用索引而不是迭代器。如果需要查找迭代器的位置,可以像这样使用std::distance

std::distance(b.begin(), my_iter)

如果您需要将向量a 中的迭代器i 移动到与向量b 中的迭代器j 相同的位置,可以这样做:

auto i = a.begin();
// j is an iterator in vector "b"
advance(i, distance(b.begin(), j));

【讨论】:

请注意,有些库支持ziping 容器和并行迭代。【参考方案2】:

您可以使用以下内容:

#include <iterator>
j = b.begin() + distance(i, a.begin());

【讨论】:

更重要的是,以上将非常有效。【参考方案3】:

不,这是不可能的。迭代器不能在两个容器之间共享。如果您希望有一个通用索引来迭代两个 vectors,请改用 operator[]

【讨论】:

【参考方案4】:

迭代器可以在向量之间共享吗?

不可以,每个迭代器变量最多只能引用一个容器中的一个元素,比较引用不同容器中元素的迭代器是不合法的。

但是...在代码if(*j == *i) 中,您不是在比较迭代器,而是在比较迭代器所引用的值。这是完全合法的,不管迭代器 ij 引用的容器是什么(只要它们是可解引用的,即它们引用一个有效的元素)。

然后我得到指向相同位置但在向量 b 中的迭代器 j?

这在上述代码的上下文中没有意义。如果您的意思是在一个容器中选择一个元素并在第二个容器中选择引用相同位置(索引)的迭代器,那么您可以这样做:

j = std::next(b.begin(),std::distance(a.begin(),i));

再一次,有一些算法可以用于相同的目的:

std::find()          // find an element equal to the last argument
std::find_if()       // find an element that matches a functor

【讨论】:

【参考方案5】:

不,您不能比较不同集合的迭代器,甚至不能比较相同类型和相同数据的迭代器。只是因为这两个向量看起来是一样的,它们是两个不同的对象,因此底层数据占用的内存是不同的。

【讨论】:

【参考方案6】:

更简洁的方法是使用 std::find(),如下所示:

j = std::find(b.begin(), b.end(), *i);

【讨论】:

以上是关于迭代器可以在 C++ 中的向量之间共享吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++中的向量迭代器

如何仅使用 C++ 中的迭代器正确迭代 3D 向量? [关闭]

为啥 C++ 共享指针的行为不像迭代器的标准指针?

C++:在开始之前不能寻找向量迭代器

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

向量迭代器不可取消引用 C++