在模板函数中需要什么类型的迭代器?

时间:2016-11-15 19:02:22

标签: c++ stl iterator

我正在基于计数排序制作我自己的sort()算法。它对范围有限的正数进行排序。到目前为止,它适用于std :: string和std :: vector。

原型如下:

template<class ForwardIterator, int maxNumbers>
void sortIntegers(ForwardIterator start, ForwardIterator end)

我的算法使用*iter =++itercopy = iter。从http://www.cplusplus.com/reference/iterator/我确定我需要一个或更好的ForwardIterator。

这是确定我的算法所需的最通用类型的迭代器的正确方法吗?我不确定我应该尝试通用。我猜对了。这样我就可以支持最多的容器了。然后,当我查看STL sort()时,我发现它使用随机访问迭代器(http://www.cplusplus.com/reference/algorithm/sort/)。对我来说,这意味着它受限于它支持的容器。例如,它会在列表上工作吗?

我认为STL做得对。那么为什么我错了只需要在我的函数中使用ForwardIterator?也许当我测试更多的容器类型时,我会意识到我需要更严格的限制?

另外作为奖励,我知道只是将类类型命名为ForwardIterator只是文档要求。 STL是否做了更多工作来确保传递给sort()的是一个随机访问迭代器?所以,如果我将列表迭代器传递给sort(),我认为我得到了错误。这些错误是如何产生的?

2 个答案:

答案 0 :(得分:3)

  

这是确定我的算法所需的最通用类型的迭代器的正确方法吗?

嗯,是的。查看概念并确定算法所需的迭代器概念是正确的方法。

  

对我而言,这意味着它受限于它支持的容器。例如,它可以在列表上工作吗?

不,它不会在std::list上工作,因为std::list仅支持RandomAccessIterator派生自的BidirectionalIterator概念。是的,因为它限制在某些容器上。

  

那么为什么我的错误只需要在我的函数中使用ForwardIterator?

没错,但是你是有限的,例如你不能使用--it,但如果可以,那就没有错。 C ++只是希望尽可能多地实现实现。我想。

  

STL是否做了更多工作以确保传递给sort()的是一个随机访问迭代器?

不,没有保护。唯一的问题是,如果你不使用RandomAccessIterator调用它,你将得到一个错误(或多个),因为你的迭代器不支持std::sort所需的操作(如[],{ {1}},...)。

有一个TS for Concepts,它可以做到这一点,对模板参数强制执行编译时要求,并在使用错误的类型时产生有用的错误消息。但这可能会出现在C ++ 20中。

你也可以进行特征检查以检查迭代器的标签,正如@JustinTime所建议的那样,但遗憾的是标准不要求这样做,所以没有或很少有实现真的这样做(我不知道,所以我可以&# 39;确定这一点。)

答案 1 :(得分:1)

好吧,你要求参数在这里ForwardIterator

您看,template<class ForwardIterator, int maxNumbers>表示模板接受两个参数:其中一个是类,另一个只是一个整数。请注意,没有要求或限制强加于该类的类型。 C ++ 关心参数的名称​​,它更关心类型。