如何迭代修改后的std :: map值?

时间:2010-05-01 01:39:50

标签: c++ boost iterator

我有std::map,我想定义一个返回修改后的值的迭代器。通常,std::map<int,double>::iterator迭代std::pair<int,double>,我想要相同的行为,只需将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,我真的需要吗?

我调整了heretransform_iterator教程代码来编写此代码...

2 个答案:

答案 0 :(得分:5)

std :: multiply,它指的是第一个参数的double,而不是std :: pair。

transform函数必须采用单个std :: pair参数(因为map元素是键值对)并返回你想要的任何内容。

可以使用以下函数代替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));

答案 1 :(得分:2)

typedef boost::transform_iterator<Function, 
  Map::iterator> MultiplyIter; // value_type* only occasionally
                               // works as an iterator

gen_map似乎是std::map下的类名。

本教程使用int*,因为指针是迭代C风格数组的正确类型。