Извиняюсь, если об этом уже спрашивали. Я не мог найти ответ на это.
Законно ли использовать итератор в качестве индекса смещения?
Например:
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.
Большое спасибо!
Вы не можете напрямую использовать итераторы в качестве индексов.
Однако, если вы хотите использовать итераторы «position» в своем контейнере, чтобы получить нужный индекс, вы можете сделать это с помощью станд :: расстояние, т.е .:
unsigned int index = std::distance(v2.begin(), it);
//if it was the fifth element, index's value is 4.
Если v1
а также v2
являются экземплярами пользовательского типа данных, тогда да, это возможно, потому что вы можете создать перегруженный operator[]
функции, которые принимают правильные типы итераторов в качестве аргументов.
Однако это не так просто, как кажется v2
кажется указатель, поэтому вам нужно сначала разыменовать его:
(*v2)[it]
или вызовите функцию оператора явно:
v2->operator[](it)
Для параллельного обхода нескольких контейнеров вы можете использовать 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.