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

C++ 如何迭代修改的std::map值?,c++,boost,iterator,C++,Boost,Iterator,我有一个std::map,我想定义一个返回修改值的迭代器。通常,一个std::map::iterator在std::pair上进行迭代,我想要相同的行为,只是将双精度值乘以一个常量 我用boost::transform\u迭代器尝试了它,但它没有编译: #include <map> #include <boost/iterator/transform_iterator.hpp> #include <boost/functional.hpp> typedef

我有一个
std::map
,我想定义一个返回修改值的迭代器。通常,一个
std::map::iterator
std::pair
上进行迭代,我想要相同的行为,只是将双精度值乘以一个常量

我用
boost::transform\u迭代器尝试了它,但它没有编译:

#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
#包括
#包括
#包括
typedef std::map;
地图m;
m[100]=2.24;
typedef boost::binder2nd函数;
typedef boost::transform_迭代器乘法器;
乘法器开始=
boost::make_transform_迭代器(m.begin(),
函数(std::multiplies(),4));
//现在,我们想类似地创建一个结束迭代器
//然后在修改后的映射上迭代
错误是:

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
错误:从“boost”转换
::变换迭代器<
boost::binder2nd,gen_map::迭代器
,boost::使用默认值,boost::使用默认值
>“到非标量类型”boost::transform_迭代器<
boost::binder2nd,成对*
,boost::使用默认值,boost::使用默认值
>“请求
什么是
gen\u map
,我真的需要它吗

我修改了中的
transform\u iterator
教程代码来编写此代码…

typedef boost::transform\u iterator MultiplyIter;///值类型*仅偶尔使用
typedef boost::transform_iterator<Function, 
  Map::iterator> MultiplyIter; // value_type* only occasionally
                               // works as an iterator
//作为迭代器工作
gen_map
似乎是
std::map
下面的类名


本教程使用
int*
,因为指针是在C样式数组上迭代的合适类型。

std::multiply,它期望双精度作为第一个参数,而不是std::pair

transform函数必须采用单个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));
双倍(标准::成对常数和p,整数i){
返回i*p.second;
}
boost::make_transform_迭代器(m.begin(),
功能(次数4次);

函数的
typedef
是否需要为此进行更改?是的,需要将其从value\u类型更改为迭代器类型,正如Potatowatter所回答的那样。很高兴boost使这一切成为可能,但我希望有更简单的解决方案可用。。。