2011-01-24 59 views
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; 
} 

回答

4

這就是我只是猜測,但transform_iterator是圍繞函數對象和基本的迭代器的包裝。如果引用操作的返回類型是一樣的類型定義爲您的仿函數result_type的我就不會奇怪爲什麼。您是否嘗試過使用引用類型作爲result_type-typedef?

換句話說改變

typedef holder result_type; 

typedef holder const& result_type; 

,並看看會發生什麼......

+0

問題解決了!非常感謝... – user588241 2011-01-24 23:29:34