2015-09-28 55 views
2

我有一個時間系列類TimeSeries,我需要能夠從某些日期和值構造它。 Date是日期類。我現在有這樣的構造:使用迭代器的通用構造函數

TimeSeries(std::vector<Date>::const_iterator dates, std::vector<double>::const_iterator values, std::size_t s)

,我把它用TimeSeries(dates.begin(), fixings.begin(), size)其中datesstd::vector<Date>fixingsstd::vector<double>

但我想調整的構造函數,因此我可以使用C++的只是打電話的迭代器不參照基礎數據類型標準庫方式:dates,並values不需要上std::vector迭代器。

可悲的是我不能解決構造函數的參數問題。可能嗎?

+0

重複的http://stackoverflow.com/questions/1104035/generic-iterator-in-c – ypnos

回答

2

是的,這是可能的。爲什麼不實施它「C++標準庫方式」呢?

template<class DateIt, class ValueIt> 
TimeSeries(DateIt dates, ValueIt values, std::size_t s) 
{ 
    /*ToDo - your construction here*/ 
} 

然後你可以使用TimeSeries(dates.begin(), fixings.begin(), size)來調用它。

我的「靈感」是從的方式採取std::max_element作品:http://en.cppreference.com/w/cpp/algorithm/max_element

1

您可以使用模板來接受任何類迭代器對象。要修復界面,在標準庫中尋找類似的行爲通常是一個好主意。

在這種情況下,您想迭代兩個序列,它們具有相同數量的元素,並對每個元素執行一些操作(即將它們插入到您的時間序列中)。這聽起來在它的兩個序列的形式很像std::transform

template< class InputIt1, class InputIt2, class OutputIt, 
      class BinaryOperation > 
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, 
        OutputIt d_first, BinaryOperation binary_op); 

你不需要用戶能夠指定一個二進制的操作;你的構造函數已經知道該怎麼做。你也不想的輸出迭代器,剛剛離開begin,end對第一個序列,begin迭代器的第二個序列:

template <typename DateIterator, typename ValueIterator> 
TimeSeries(DateIterator first, DateIterator last, ValueIterator first2); 

這種形式只需要該值序列具有至少多元素作爲日期序列中指定的範圍。特別是,沒有明確給出大小,所以這種形式可以與更通用的輸入迭代器概念一起使用,而不僅限於前向迭代器(參見迭代器類別的http://en.cppreference.com/w/cpp/iterator)。