2013-07-02 1 views
3

В C++, если у меня есть два массива a[10] and b[10], я могу ввести индекс i, который можно использовать для обоих массивов точек (i + 1) -й элемент, a[i] and b[i]. Является ли итератор может быть общим, а также или мне нужно сделать что-то вроде:Может ли итератор делиться между векторами в C++?

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; 
    } 
} 

, а затем я получаю итератора J, который указывает на то же место, но в вектор Ь? Могу ли я просто узнать положение i в a, а затем j=b.begin()+pos(i)

+0

Что означает, что итератор будет «равен десяти»? – jalf

+0

Непонятно, что это за намерение. Хотя, как указано, четкий ответ НЕТ, ответ на ваш реальный вопрос может быть ДА –

ответ

3

Итераторы в стандартной библиотеке C++ моделируются после указателей, а не после индексов. Точно так же, как указатели не могут быть разделены между несколькими массивами, итераторы не могут быть разделены между векторами или другими коллекциями.

Если вам нужно повторять несколько векторов параллельно, вы можете использовать индексы, а не итераторы. Если вам нужно найти позицию итератора, вы можете использовать std::distance как это:

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

Если вам нужно переместить итератор i в векторе a в том же положение, как итератор j в векторе b, вы можете сделать это:

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

Обратите внимание, что существуют библиотеки, которые поддерживают контейнеры zip и контейнеры и параллельную итерацию. – Yakk

0

Нет, вы не можете сравнивать итераторы для разных коллекций, даже не того же типа и с равными данными. Просто потому, что два вектора кажутся одинаковыми, они представляют собой два разных объекта, и поэтому память, занимаемая базовыми данными, различна.

1

Вы можете использовать следующее:

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

Что еще, выше будет довольно эффективно. – Yakk

1

нет, это не поз sible. Итераторы не могут использоваться между двумя контейнерами. Если вы хотите иметь общий индекс для итерации по двум vector, используйте вместо этого operator[].

0

уборщик способ сделать это было бы с помощью станд :: найти() следующим образом:

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

1

Может итератор быть разделены между векторами?

Нет, каждая переменная итератора может ссылаться на элемент не более одного контейнера, и нецелесообразно сравнивать итераторы, ссылающиеся на элементы в разных контейнерах.

Но ... в коде if(*j == *i) вы не сравниваете итераторы, а значения, на которые ссылаются итераторы. Это совершенно законно, независимо от контейнеров, которые итераторы i и j относятся к (до тех пор, пока они не являются dereference-able, то есть они относятся к действительному элементу).

, а затем я получаю итератор j, который указывает на ту же позицию, но в векторе b?

Это не имеет смысла в контексте приведенного выше кода.Если то, что вы имеете в виду сделать, это выбрать элемент в одном контейнере и итератор во втором контейнере, который относится к той же позиции (индекс), то вы можете сделать это:

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 
Смежные вопросы