Есть два типа A и B, между объектами этих типов установлено соответствие. Есть набор X значений типа А и итератор по этому набору. Необходимо с минимальными трудозатратами на основе итератора X получить итератор по значениям типа B.
В общем по-простому говоря, есть контейнер типа A, из итератора А нужно получить итератор B, потому что клиент принимает итераторы B.
Например:
typedef std::pair
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
using A = std::pair
float A2B(const A & item)
{
return item.second;
}
template
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) << '
';
}
>>> То же на реальном компиляторе <<<
Комментариев нет:
Отправить комментарий