2015-02-20 2 views
-3

Ниже приведена простая программа для печати позиции внутри вектора небольшого диапазона значений int.C++ forward iterator arithmetic

int mynumbers [] = { 3, 9, 0, 2, 1, 4, 5 }; 
vector<int> v (mynumbers, mynumbers + 7); 
int m1[] = {9, 0, 2 }; 
vector<int>::iterator it = find_end (v.begin(), v.end(), m1, m1+3); 
if (it != v.end()) 
    cout << "Found at position: " << it-v.begin() << endl;//LINE I 

Программа, как ожидается, печатает

Найдено в позиции: 1

функция возвращает find_end вперед итератора. Логически это не имеет никакого смысла для меня, чтобы сделать это, но когда я изменяю «ЛИНИЯ Я»

cout << "Found at position: " << it+v.begin() << endl;//LINE I 

Я получаю ошибку компиляции. Я знаю, что я должен использовать «расстояние», однако я просто пытаюсь знакомиться с ограничениями различных типов итераторов

Благодаря

+0

Что такое операция делать? –

+0

Это не имеет смысла, и он не компилируется. Я бы назвал это победой. В чем проблема? Похоже, что вы спрашиваете, почему 'dos # & * $ #% ifosidfjsdo;' не компилируется. – chris

+0

Почему вы используете как массив, так и std :: vector? –

ответ

1

Простой ответ заключается в том, что есть операция, определенная для b - a, где b и a имеют те же типы итераторов, но не существует операция, определенная для b + a.

Источники:

ненормативный: cppreference, RandomAccessIterator

Нормативные: N4140, [random.access.iterators] Таблица 111

3

it итератор, он представляет собой расположения где объект ,

Вы говорите «логически, что для меня нет смысла это делать ...» около it+v.begin(), что верно, потому что вы добавляете два местоположения. Что вы получаете, когда добавляете местоположение Калифорнии в расположение Нью-Йорка? Вопрос буквально не имеет смысла.

Однако вы можете взять расстояние между двумя точками: it-v.begin(). Не уверен, что именно вы спрашиваете, но я надеюсь, что это покрыло.

0

Вы находитесь на правильном пути.

Но я думаю distance, что вы упоминаете в своем вопросе ваше действительное решение: http://www.cplusplus.com/reference/iterator/distance/

Это ваша ситуация:

 
begin() --> 3 
it -->  9 
      0 
      2 
      1 
      4 
      5 

distance(v.begin(), it) расскажет вам, как далеко эти два указателя врозь. (В этом случае 1).

Теперь помните, что под капотом distance будет делать то же вычитание, которое вы делаете в этом случае.

Как вы должны думать об этом, v.begin() - это адрес, а также it.

v.begin() является 0x0100
it является 0x0104

когда вы вычитаете их вы собираетесь получить (0x0104 - 0x0100)/sizeof(int) так что вы получите 1.