Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

Обвертка над итератором для преобразования типа

Есть два типа A и B, между объектами этих типов установлено соответствие. Есть набор X значений типа А и итератор по этому набору. Необходимо с минимальными трудозатратами на основе итератора X получить итератор по значениям типа B.
В общем по-простому говоря, есть контейнер типа A, из итератора А нужно получить итератор B, потому что клиент принимает итераторы B.
Например:
typedef std::pair A; typedef float B;
B A2B(const A & item) // соответствие между A и B { return item.second; }
std::vector X; input_iterator bi = magic_iterator_wrapper(A2B, X.begin());
Чем может быть magic_iterator_wrapper?


Ответ

Можно использовать boost::transform_iterator
#include #include #include #include
using A = std::pair; using B = float;
float A2B(const A & item) { return item.second; }
template auto make_transform_iterator(I i, F f) { return boost::transform_iterator{i, f}; }
int main() { std::vector
v = {{0, 1}, {0, 20}};
auto first = make_transform_iterator(v.begin(), A2B); auto last = make_transform_iterator(v.end(), A2B);
std::cout << std::accumulate(first, last, 0) << '
'; }
>>> То же на реальном компиляторе <<<

Комментариев нет:

Отправить комментарий