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

what type of iterator to require in a template function?

本文关键字:什么 类型 迭代器 函数      更新时间:2023-10-16

我正在制作自己的基于计数排序的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只是文档要求。STL是否做了更多的工作来确保传递给sort()的是一个随机访问迭代器?因此,如果我向sort()传递一个列表迭代器,我假定会得到错误。这些错误是如何产生的?

这是确定我的算法需要的最泛型迭代器类型的正确方法吗?

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

对我来说,这意味着它受限于它所支持的容器。例如,它能在列表中工作吗?

不,它不能在std::list上工作,因为std::list只支持BidirectionalIterator概念,RandomAccessIterator是从它派生出来的。是的,因此在某些容器上是有限制的。

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

这不是错的,但你是有限的,例如,你不能使用--it,但如果这是好的,那么它没有什么错。我想c++只是想给实现尽可能多的自由。

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

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

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

你也可以做一个trait检查来检查迭代器的标签,正如@ justtime建议的那样,但遗憾的是,这不是标准所要求的,所以没有或很少的实现实际上这样做(我知道没有,所以我不能确定)。

好吧,您并没有要求这里的参数为ForwardIterator s。

你看,template<class ForwardIterator, int maxNumbers>意味着模板接受两个形参:其中一个是类,另一个只是一个整数。注意没有对该类的类型施加任何要求或限制。c++ 不那么关心参数的名字,它更关心类型。