2011-08-07 54 views
13

我不時感到需要某種迭代器(除了這個問題標題前面的那個名稱之外,我無法給出一個好名字)。序列迭代器?是不是有一個在提升?

假設我們有一個映射整數類型T.這是一個函數(或函數對象),我們有一個數學序列的定義,但我們實際上沒有它存儲在內存中。我想製作一個迭代器。迭代器類將是這個樣子:

template <class F, class T> 
class sequence_iterator : public std::iterator<...> 
{ 
    int i; 
    F f; 
    public: 
    sequence_iterator (F f, int i = 0):f(f), i(i){} 
    //operators ==, ++, +, -, etc. will compare, increment, etc. the value of i. 
    T operator*() const 
    { 
     return f(i); 
    }  
}; 

template <class T, class F> 
sequence_iterator<F, T> make_sequence_iterator(F f, int i) 
{ 
    return sequence_iterator<F, T>(f, i); 
} 

也許我太天真,但我個人覺得這個迭代器會非常有用。例如,假設我有一個函數來檢查數字是否爲素數。我想要計算區間[a,b]中的素數數目。我會這樣做;

int identity(int i) 
{ 
    return i; 
} 
count_if(make_sequence_iterator<int>(identity, a), make_sequence_iterator<int>(identity, b), isPrime); 

因爲我發現一些東西,這將是有益的(至少恕我直言)我絕對是積極的,它存在於升壓或標準庫。我無法找到它。所以,有沒有像這樣的提升?。在不太可能發生的情況下,我將寫下一個 - 在這種情況下,我想知道您是否應該製作iterator_categoryrandom_access_iterator_tag。我擔心的是,這不是真正的RAI,因爲operator*沒有返回參考。

在此先感謝您的幫助。

+1

CUDA Thrust恰好具有這種功能,可以避免產生「微不足道的」顯式序列。 –

+0

這讓我想起了馬修威爾遜的[Fibonacci_sequence](http://www.informit.com/content/images/9780321305503/samplechapter/0321305507_CH23.pdf)。它更像你在說什麼的具體情況,但它可能ATLEAST給你一些想法或靈感:-) – mrm

+0

MRM:準確地說,我想那:) –

回答

6

boost::counting_iteratorboost::transform_iterator應該做的伎倆:

template <typename I, typename F> 
boost::transform_iterator< 
    F, 
    boost::counting_iterator<I>> 
make_sequence_iterator(I i, F f) 
{ 
    return boost::make_transform_iterator(
     boost::counting_iterator<I>(i), f); 
} 

用法:

std::copy(make_sequence_iterator(0, f), make_sequence_iterator(n, f), out); 
1

我會叫這個整數的映射迭代器,因爲它在整數序列的函數映射。不,我從來沒有在Boost或STL中遇到過這個問題。我不確定這是爲什麼,因爲你的想法非常類似於流迭代器的概念,它也通過調用函數來生成元素。

是否要隨機訪問迭代取決於您。我會嘗試首先構建一個前向或雙向迭代器,因爲(例如)重複二進制搜索整個序列可能會更快,如果它們一次生成並存儲。

0

是否boost::transform_iterator填滿您的需求?在boost中有幾個有用的迭代器適配器,文檔是here

+0

泛化沒有呢,可惜transform_iterator已經需要一個迭代器。 –

0

我覺得boost::counting_iterator是你在找什麼,或至少來自最接近的一次。有沒有你正在尋找它不提供?人們可以做,例如:

std::count_if(boost::counting_iterator<int>(0), 
     boost::counting_iterator<int>(10), 
     is_prime); // or whatever ... 

總之,這是在連續值的懶惰序列的迭代器。

0

Boost.Utility包含generator iterator adaptor。來自文檔的一個示例:

#include <iostream> 
#include <boost/generator_iterator.hpp> 

class my_generator 
{ 
public: 
    typedef int result_type; 
    my_generator() : state(0) { } 
    int operator()() { return ++state; } 
private: 
    int state; 
}; 

int main() 
{ 
    my_generator gen; 
    boost::generator_iterator_generator<my_generator>::type it = 
     boost::make_generator_iterator(gen); 
    for (int i = 0; i < 10; ++i, ++it) 
     std::cout << *it << std::endl; 
} 
相關問題