C ++将iterator与int进行比较

时间:2013-05-14 02:14:49

标签: c++ loops iterator comparison int

是否有一种简单的方法可以将迭代器与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)

有一种很好的方法可以达到同样的效果吗?

4 个答案:

答案 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错误。

这适用于随机访问容器(例如vectorarray),但不会在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()。