Как перебрать измененные значения std :: map? - PullRequest
3 голосов
/ 01 мая 2010

У меня есть std::map, и я хотел бы определить итератор, который возвращает измененные значения. Как правило, std::map<int,double>::iterator итерирует по std::pair<int,double>, и мне хотелось бы того же поведения, просто двойное значение умножается на константу.

Я пробовал с boost::transform_iterator, но он не компилируется:

#include <map>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/functional.hpp>

typedef std::map<int,double> Map;
Map m;
m[100] = 2.24;

typedef boost::binder2nd< std::multiplies<double> > Function;
typedef boost::transform_iterator<Function, 
                                  Map::value_type*> MultiplyIter;

MultiplyIter begin = 
  boost::make_transform_iterator(m.begin(),
                                 Function(std::multiplies<double>(), 4));
// now want to similarly create an end iterator
// and then iterate over the modified map

Ошибка:

error: conversion from 'boost
::transform_iterator<
    boost::binder2nd<multiplies<double> >, gen_map<int, double>::iterator
  , boost::use_default, boost::use_default
>' to non-scalar type 'boost::transform_iterator<
    boost::binder2nd<multiplies<double> >, pair<const int, double> *
  , boost::use_default, boost::use_default
>' requested

Что такое gen_map и действительно ли оно мне нужно?

Я адаптировал учебный код transform_iterator из здесь , чтобы написать этот код ...

Ответы [ 2 ]

5 голосов
/ 01 мая 2010

std :: multiply, которые ожидают двойного в качестве первого аргумента, а не std :: pair.

Функция преобразования должна принимать один аргумент std :: pair (поскольку элементы карты являются парой ключейзначения) и вернуть все, что вы хотите.

Следующая функция может быть использована вместо std :: multiply.

double times(std::pair<int,double> const& p, int i) {
  return i*p.second;
}

boost::make_transform_iterator(m.begin(),
                                 Function(times, 4));
2 голосов
/ 01 мая 2010
typedef boost::transform_iterator<Function, 
  Map::iterator> MultiplyIter; // value_type* only occasionally
                               // works as an iterator

gen_map представляется именем класса, лежащим в основе std::map.

В учебнике используется int*, потому что указатель является правильным типом для перебора массива в стиле C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...