4

在 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)

4

6 回答 6

4

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

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

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

如果需要将 vector 中的迭代器移动到与ivector中的迭代器a相同的位置,可以这样做:jb

auto i = a.begin();
// j is an iterator in vector "b"
advance(i, distance(b.begin(), j));
于 2013-07-02T18:38:22.017 回答
1

您可以使用以下内容:

#include <iterator>
j = b.begin() + distance(i, a.begin());
于 2013-07-02T18:39:20.073 回答
1

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

于 2013-07-02T18:40:09.317 回答
1

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

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

但是......在代码中,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
于 2013-07-02T18:54:54.180 回答
0

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

于 2013-07-02T18:37:31.400 回答
0

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

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

于 2013-07-02T18:50:45.483 回答