使用迭代器的通用构造函数

时间:2015-09-28 09:04:48

标签: c++

我有一个时间序列类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 ++标准库来调用迭代器而不引用底层数据类型:datesvalues不需要是std::vector上的迭代器。

可悲的是,我无法解决构造函数参数。有可能吗?

2 个答案:

答案 0 :(得分:2)

是的,这是可能的。为什么不实现它&#34; C ++标准库方式&#34;太?

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

然后您可以使用TimeSeries(dates.begin(), fixings.begin(), size)调用它。

我的灵感&#34;取自std::max_element的工作方式:http://en.cppreference.com/w/cpp/algorithm/max_element

答案 1 :(得分: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以获取迭代器类别)。