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使这一切成为可能,但我希望有更简单的解决方案可用。。。