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

标签 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我真的需要它吗?

我改编了transform_iterator教程代码来自 here编写这段代码...

最佳答案

std::multiply 期望 double 作为第一个参数,而不是 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));

关于c++ - 如何迭代修改后的 std::map 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2748550/

上一篇:C++父类对齐

下一篇:C++ "delayed"模板参数

相关文章:

c++ - 使用 MAPI 的文件附件的 Unicode 文件名

java - 静态变量初始化?

c++ - C++ boost::shared_ptr 的深拷贝

c++ - 如何在 C++ 中使共享内存线程安全的容器

c++ - 在 boost::variant 对象 vector 之后进行清理

c++ - 用qml ListView显示Json数据

c++ - 如何计算调用递归的次数? (计算 x^n 的乘法次数)

c++ - 遍历指向类的指针 vector

java - Java HashSet 奇怪的迭代器行为

c++ - Boost : Function Output Iterator, 重新发明轮子