使用迭代器的泛型构造函数

Generic constructor using iterators

本文关键字:泛型 构造函数 迭代器      更新时间:2023-10-16

我有一个时间序列类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上的迭代器。

遗憾的是我不能算出构造函数的参数。这可能吗?

这是可能的。为什么不以"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

您可以使用模板来接受任何类似迭代器的对象。要修复接口,在标准库中查找类似的行为通常是一个好主意。

在这种情况下,您想要迭代两个具有相同数量元素的序列,并对每个序列做一些事情(即,将它们插入您的时间序列中)。这听起来很像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了解迭代器类别)。