Использование итераторов в качестве индекса смещения

Извиняюсь, если об этом уже спрашивали. Я не мог найти ответ на это.
Законно ли использовать итератор в качестве индекса смещения?
Например:

for (list<T> iterator::it = v2->vals.begin(); it!=v2->vals.end();++i) {
v3.push_back(v2[it] + v1[it]);
}

где: const Vec& v2
и vals — это список в защищенном классе Vec.

Большое спасибо!

-1

Решение

Вы не можете напрямую использовать итераторы в качестве индексов.

Однако, если вы хотите использовать итераторы «position» в своем контейнере, чтобы получить нужный индекс, вы можете сделать это с помощью станд :: расстояние, т.е .:

unsigned int index = std::distance(v2.begin(), it);
//if it was the fifth element, index's value is 4.
4

Другие решения

Если v1 а также v2 являются экземплярами пользовательского типа данных, тогда да, это возможно, потому что вы можете создать перегруженный operator[] функции, которые принимают правильные типы итераторов в качестве аргументов.

Однако это не так просто, как кажется v2 кажется указатель, поэтому вам нужно сначала разыменовать его:

(*v2)[it]

или вызовите функцию оператора явно:

v2->operator[](it)
0

Для параллельного обхода нескольких контейнеров вы можете использовать Boost.Iterator Zip Iterator:

std::transform(
boost::make_zip_iterator(boost::make_tuple(begin(v1), begin(v2))),
boost::make_zip_iterator(boost::make_tuple(  end(v1),   end(v2))),
std::back_inserter(v3),
[](boost::tuple<int const &, int const&> const &p) {
return p.get<0>() + p.get<1>();
}
);

Правда, синтаксис меня не особо убедил. ИМХО, эта библиотека выиграет от некоторого перенаправления C ++ 11/14.

0
По вопросам рекламы [email protected]