我要小心,因为您很容易遇到栅栏错误。
这适用于随机访问容器(如vector
and ),但由于我很懒,所以array
不做 ADL :begin
template<typename Container>
auto nth_element( Container&& c, std::size_t n )->decltype( std::begin(c) )
{
auto retval = std::begin(c);
std::size_t size = std::end(c) - retval;
retval += std::min( size, n );
return retval;
}
std::end(c)
如果n
太大,它会返回。
所以你得到:
for( auto it = vec->cbegin(); it != nth_element(vec, 3); ++it) {
// code
}
它优雅地处理大小小于 3 的向量。
其基本核心是在随机访问迭代器上,迭代器的区别是ptrdiff_t
——一个整数类型——你可以在迭代器中添加整数类型来移动。我只是加入了一个辅助函数,因为如果你能提供帮助,你应该只在孤立的函数中进行非平凡的指针算术(并且迭代器上的算术是指针算术)。
支持非随机访问迭代器是做一些特征检查的问题。除非你真的需要,否则我不会担心。
请注意,这个答案取决于一些 C++11 特性,但没有晦涩难懂的特性。你需要#include <iterator>
forstd::begin
并且std::end
也许<algorithm>
for std::min
。