加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:27:30 所属栏目:百科 来源:网络整理
导读:我有一个std :: map,我想定义一个返回修改后的值的迭代器.通常,std :: map int,double :: iterator遍历std :: pair int,double,我想要相同的行为,只需将double值乘以常量. 我用boost :: transform_iterator尝试了它,但它没有编译: #include map#include boo
我有一个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
>' requested

什么是gen_map,我真的需要吗?

我从here改编了transform_iterator教程代码来编写这段代码……

解决方法

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));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读