gpt4 book ai didi

c++ - 回复:使用 boost::make_transform_iterator 进行引用访问

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:39:01 24 4
gpt4 key购买 nike

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

在我的问题中, 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;
}

最佳答案

这只是我的猜测,但 transform_iterator 是函数对象和基础迭代器的包装器。如果它的取消引用运算符的返回类型与仿函数的 result_type 的 typedef 相同,我不会感到惊讶。您是否尝试过将引用类型用作 result_type-typedef?

换句话说就是改变

typedef holder result_type;

typedef holder const& result_type;

看看会发生什么......

关于c++ - 回复:使用 boost::make_transform_iterator 进行引用访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4788112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com