首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Re:使用boost::make_transform_iterator进行引用访问

Re:使用boost::make_transform_iterator进行引用访问
EN

Stack Overflow用户
提问于 2011-01-24 22:48:00
回答 1查看 1.6K关注 0票数 6

我正在尝试使用boost::make_transform_iterator为一个自定义类创建一个迭代器,该类的数据保存在一个映射中,迭代器使用键的向量来访问值。

在我的问题中,map的值是保存大量数据的容器。因为我无法复制数据,所以我想通过迭代器通过引用来访问数据。但是,在执行此操作时,数据会被破坏,正如我所附的简单示例的输出所示。

据我所知,问题出在from_key函数器的使用上,该函数器是使用对映射的引用和boost::make_transform_iterator的语义初始化的。

有什么想法可以让我用boost正确地做到这一点吗?

谢谢,

帕特里克

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-24 23:07:31

这只是我的猜测,但transform_iterator是函数对象和基本迭代器的包装器。如果它的解引用运算符的返回类型与函数器的result_type的类型定义相同,我不会感到惊讶。你有没有试过使用引用类型作为result_ type -typedef?

换句话说,改变

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef holder result_type;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef holder const& result_type;

看看会发生什么..。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4788112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文