2016-11-10 75 views
2

我有一些(模板)迭代器對Iterator begin1Iterator end1。我有一個功能foo,帶簽名什麼是快速和骯髒的方式來獲取適應性迭代器?

template <typename ForwardIterator> 
void foo(ForwardIterator begin, ForwardIterator end); 

它在那個範圍上做了些什麼。現在,我希望foo不會影響實際的範圍元素,而是會影響這些元素通過一些lambda或某種函數bar的轉換。我不能使用std :: transform或以其他方式使用臨時存儲的轉換值,因爲這將佔用太多的空間或因爲我不允許在堆上分配任何東西。

現在,我知道我可以自己實現某種適配迭代器,但我寧願使用現成的東西,而不是重新發明輪子。

那麼,什麼是快速和骯髒的方式來獲得適當的適配迭代器對,我可以通過foo做我想要的?即對我來說,能夠調用

foo(magic(begin), magic(end)) 

auto new_pair = magic(begin, end); 
foo(new_pair.first, new_pair.second); 

+0

Try @ eric-niebler's [range-v3 library](https://github.com/ericniebler/range-v3)最終會成爲標準! –

+1

[boost迭代器適配器](http://www.boost.org/doc/libs/1_62_0/libs/iterator/doc/index.html)是另一種替代方案 – Jarod42

+0

@BrianRodriguez:你能更具體/明確嗎?那成了答案? – einpoklum

回答

2

Eric Niebler的range-v3庫爲此提供了一個非常好的解決方案,並計劃將其納入未來的標準。這裏有一個簡單的例子:

std::vector<int> vi{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
using namespace ranges; 
auto rng = vi | view::transform([](int x){ return x % 2; }); 
foo(rng.begin(), rng.end()); // When foo dereferences these iterators, it 
           // will see: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0]. 

順便說一下,這是所有的懶惰和高效。 :)

+1

!我知道圖書館,有時我讀過他的博客,但我不知道這個語法!太奇妙了。模擬像cat這樣的命令鏈不會太難grep |杯子「的語法。 –

相關問題