5
我想使用boost :: make_transform_iterator創建一個自定義的類,它的數據在地圖舉行,在迭代器使用密鑰來訪問值的向量的迭代器。回覆:用升壓參考訪問:: make_transform_iterator
在我的問題,地圖的值是其持有大量數據的容器。因爲我不能複製數據,我想引用通過迭代器來訪問數據。但是,這樣做時,該數據被損壞,如通過簡單的例子我已附加的輸出例子。
據我所知,問題在於使用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;
}
問題解決了!非常感謝... – user588241 2011-01-24 23:29:34