在模板函数中需要什么类型的迭代器
what type of iterator to require in a template function?
我正在制作自己的基于计数排序的sort()算法。它对范围有限的正数进行排序。到目前为止,它适用于std::string和std::vector。
原型如下:
template<class ForwardIterator, int maxNumbers>
void sortIntegers(ForwardIterator start, ForwardIterator end)
我的算法使用*iter =
, ++iter
和copy = 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++ 不那么关心参数的名字,它更关心类型。
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- 这在C++是什么类型的错误?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- int(int)& 或 int(int) const &是什么类型?
- 它>首先给出什么类型?
- ``n = 1u;'有什么类型
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- 二进制要找到什么类型的序列化
- 我如何找出3D容器的元素是什么类型
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- 将 lambda 作为模板参数传递:实际推导出什么类型
- 在 c 和 c++ 中,二维数组的元素是什么类型?
- 什么类型会使"std::has_unique_object_representations"返回 false?
- 这个 lambda 的参数是什么类型?
- 转换逻辑目标是什么类型
- 由值持有的成员的get函数应该具有什么类型
- C++中使用什么类型来定义数组大小