#cpp #stl #boost #итераторы
Есть два типа A и B, между объектами этих типов установлено соответствие. Есть набор X значений типа А и итератор по этому набору. Необходимо с минимальными трудозатратами на основе итератора X получить итератор по значениям типа B. В общем по-простому говоря, есть контейнер типа A, из итератора А нужно получить итератор B, потому что клиент принимает итераторы B. Например: typedef std::pairA; 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'; } >>> То же на реальном компиляторе <<<
Комментариев нет:
Отправить комментарий