2014-01-25 47 views
3

比方說,我想編寫一個簡單的函數keys,其中包含一個std::map並返回一個提供映射關鍵字的iterator_range。我會怎麼做?返回變換迭代器範圍的最佳方法

template<typename A, typename B> 
Range<A> keys(const std::map<A, B> & m) { ??? } 

我想將相同的模式應用於各種其他容器,但我認爲這是一個很好的原型示例。

編輯:我猜我需要的東西在Boost的range_adapter S和/或transform_iterator S的境界,但我還沒有與他們熟悉這裏應用它們。

+0

你說的是[升壓轉換器的'iterator_range'(HTTP: //www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/utilities/iterator_range.htm L)? – dyp

+0

是的,但我並不重視它。 –

+1

....類似於['boost :: adapters :: keys'](http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/adaptors/) reference/map_keys.html)函數? – dyp

回答

1

這個特殊的需求是通過boost::adapters::keys來實現的。更一般地說,boost::range允許你設計你自己的適配器,但它有一定的參與。所以除非你正在設計一個新的圖書館,否則你可能會逃脫transformed

如果您需要將範圍的結果返回到容器中,則可以編寫一個簡單的collect函數,該函數將「收集」管道的結果boost::range

template<typename Output, typename SinglePassRange> 
Output collect(const SinglePassRange & rng) 
{ 
    Output r; 
    boost::range::copy(rng, std::inserter(r, boost::begin(r))); 
    return r; 
} 

現在您可以輕鬆掀起一些小的功能和

  • collect<vector<int>>(numbers | filtered(odd))
  • collect<vector<int>>(numbers | transformed(doubled))
  • collect<vector<K>>(myMap | transformed(keyOf))