Страницы

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

пятница, 13 марта 2020 г.

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

#cpp #stl #boost #итераторы


Есть два типа 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?
    


Ответы

Ответ 1



Можно использовать 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) << '\n'; } >>> То же на реальном компиляторе <<<

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

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