我正在尝试使用boost::make_transform_iterator为一个自定义类创建一个迭代器,该类的数据保存在一个映射中,迭代器使用键的向量来访问值。
在我的问题中,map的值是保存大量数据的容器。因为我无法复制数据,所以我想通过迭代器通过引用来访问数据。但是,在执行此操作时,数据会被破坏,正如我所附的简单示例的输出所示。
据我所知,问题出在from_key函数器的使用上,该函数器是使用对映射的引用和boost::make_transform_iterator的语义初始化的。
有什么想法可以让我用boost正确地做到这一点吗?
谢谢,
帕特里克
#include <iostream>
#include <string>
#include <vector>
#include <boost/unordered_map.hpp>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/assign.hpp>
#include <boost/assign/std/vector.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/ref.hpp>
using namespace boost::assign;
namespace bl = boost::lambda;
class holder
{
public:
holder() : v() {};
holder( const std::vector<double>& in ) : v(in) {};
std::vector<double>& vector() { return v; };
const std::vector<double>& vector() const { return v; };
private:
std::vector<double> v;
};
class from_key
{
public:
typedef holder result_type;
from_key( const boost::unordered_map<std::string, holder >& m ) : map_(m) {};
const holder& operator() ( const std::string& in ) const { return map_.at(in); };
private:
const boost::unordered_map<std::string, holder >& map_;
};
typedef boost::transform_iterator<from_key, std::vector<std::string>::iterator > iterator;
int main()
{
std::vector<std::string> keys;
keys += "1","2","3";
std::vector<double> vals;
vals += 1.0, 2.0, 3.0;
holder h(vals);
boost::unordered_map<std::string, holder > m;
insert( m ) ( "1", h )
( "2", h )
( "3", h );
iterator it = boost::make_transform_iterator( keys.begin(), from_key( m ) );
iterator end = boost::make_transform_iterator( keys.begin(), from_key( m ) );
const std::vector<double>& v = it->vector();
std::for_each( vals.begin(), vals.end(), std::cout << bl::_1 << " " );
std::cout << std::endl;
std::for_each( v.begin(), v.end(), std::cout << bl::_1 << " " );
std::cout << std::endl;
}
发布于 2011-01-24 23:07:31
这只是我的猜测,但transform_iterator是函数对象和基本迭代器的包装器。如果它的解引用运算符的返回类型与函数器的result_type的类型定义相同,我不会感到惊讶。你有没有试过使用引用类型作为result_ type -typedef?
换句话说,改变
typedef holder result_type;
至
typedef holder const& result_type;
看看会发生什么..。
https://stackoverflow.com/questions/4788112
复制相似问题