是否有一种简单的方法可以将迭代器与int进行比较?
我有一个这样的循环:
for (std::vector<mystruct>::const_iterator it = vec->begin(); it != vec->end(); ++it)
我想循环遍历前3个元素,而不是遍历整个向量。但是,以下内容无法编译:
for (std::vector<mystruct>::const_iterator it = vec->begin(); it < 3; ++it)
有一种很好的方法可以达到同样的效果吗?
答案 0 :(得分:4)
因为它是一个向量,为什么不直接访问它的位置呢?
if (vec->size() > 0)
{
for (int i =0; i<3 && i< vec->size(); i++)
{
// vec[i] can be accessed directly
//do stuff
}
}
答案 1 :(得分:3)
std::next(vec->begin(), 3);
将是第一个之后的3位迭代器,因此您可以与之进行比较:
for (std::vector<mystruct>::const_iterator it = vec->begin(); it != std::next(vec->begin(), 3); ++it)
你的矢量需要在其中至少包含3个元素。
答案 2 :(得分:3)
我要小心,因为你很容易遇到fencepost错误。
这适用于随机访问容器(例如vector
和array
),但不会在begin
上执行ADL,因为我很懒:
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>
和std::begin
,我需要std::end
,<algorithm>
可能需要std::min
。
答案 3 :(得分:0)
当然,你可以简单地从头开始三个元素。
for (std::vector<mystruct>::const_iterator it = vec->cbegin(); it != vec->cbegin() + 3; ++it)
但是,这可能容易出错,因为在向量少于3个元素的情况下,您可能会尝试访问结尾。我认为当发生这种情况时你会遇到异常,但你可以通过以下方式阻止它:
for(std::vector<mystruct>::const_iterator it = vec->cbegin(); it != vec->cend() && it != vec->cbegin() + 3; ++it)
注意使用cbegin()和cend(),因为你要求一个const_iterator,尽管这些只在c ++ 11中可用。您可以像使用const_iterator一样轻松地使用begin()和end()。