我有一个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
,我真的需要它吗?
我改编了来自here的transform_iterator
教程代码来编写此代码……
发布于 2010-05-01 01:59:37
std::multiply,它需要一个双精度值作为第一个参数,而不是std::对。
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));
发布于 2010-05-01 01:47:05
typedef boost::transform_iterator<Function,
Map::iterator> MultiplyIter; // value_type* only occasionally
// works as an iterator
gen_map
似乎是std::map
背后的类名。
本教程使用int*
,因为指针是迭代C样式数组的合适类型。
https://stackoverflow.com/questions/2748550
复制相似问题