2010-05-01 25 views
3

我有一個std::map,我想定義一個返回修改值的迭代器。通常,一個std::map<int,double>::iterator迭代std::pair<int,double>,我想同樣的行爲,只是雙倍值乘以一個常數。如何遍歷修改後的std :: map值?

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寫這個代碼...

+0

這是很好的提升使這成爲可能在所有的,但我希望有很多可用簡單的解決方案... – Frank 2010-05-01 20:51:25

回答

5

std :: multiply期望一個double作爲第一個參數,而不是std :: pair。

轉換函數必須採用一個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)); 
+0

是否'typedef'的功能需要改變這個? – Frank 2010-05-01 20:49:39

+0

是的,需要將它從value_type更改爲迭代器類型,由Potatowatter回答。 – 2010-05-02 07:54:59

2
typedef boost::transform_iterator<Function, 
    Map::iterator> MultiplyIter; // value_type* only occasionally 
           // works as an iterator 

gen_map似乎是類名underlies std::map

本教程使用int*,因爲指針是迭代C樣式數組的適當類型。