【问题标题】:C++ comparing iterator with intC ++将迭代器与int进行比较
【发布时间】:2013-05-14 02:14:49
【问题描述】:

有没有一种简单的方法来比较迭代器和 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)

有没有什么好的方法可以达到同样的效果?

【问题讨论】:

  • 算术作品:it != vec-&gt;begin() + 3
  • @DavidO 需要确保 vec 中有超过 3 个条目。

标签: c++ loops iterator comparison int


【解决方案1】:

既然是向量,为什么不直接访问它的位置呢?

if (vec->size() > 0)
{
    for (int i =0; i<3 && i< vec->size(); i++)
    {
        // vec[i] can be accessed directly
        //do stuff 
    } 
}

【讨论】:

  • 我认为这是建议的解决方案中最明确的,但是答案可能需要稍微清理一下:不需要外部 if 测试,vec.count() 应该写成vec-&gt;size().
【解决方案2】:

std::next(vec-&gt;begin(), 3); 将是第一个之后 3 个位置的迭代器,因此您可以对其进行比较:

for (std::vector<mystruct>::const_iterator it = vec->begin(); it != std::next(vec->begin(), 3); ++it)

不过,您的矢量至少需要包含 3 个元素。

【讨论】:

  • +1。使用基本计数器也可能是一个选项(...;count &lt; 3; count++,it++)
  • @AlexeiLevenkov:或者更安全的是,(...; count &lt; 3 &amp;&amp; it != vec-&gt;end(); ...)
  • 那么,接下来是不太兼容的 C++11。
  • @user788171 然后使用operator+vec-&gt;begin() + 3.
【解决方案3】:

我要小心,因为你很容易遇到栅栏错误。

这适用于随机访问容器(如 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;
}

如果n 太大,则返回std::end(c)

所以你得到:

for( auto it = vec->cbegin(); it != nth_element(vec, 3); ++it) {
   // code
}

优雅地处理大小小于 3 的向量。

它的基本核心是在随机访问迭代器上,迭代器的区别是ptrdiff_t——一个整数类型——你可以在迭代器中添加整数类型来移动。我只是加入了一个辅助函数,因为如果你能提供帮助,你应该只在孤立的函数中进行非平凡的指针算术(迭代器上的算术是指针算术)。

支持非随机访问迭代器是做一些特征检查的问题。除非你真的需要,否则我不会担心。

请注意,此答案取决于一些 C++11 功能,但不是晦涩难懂的。对于std::beginstd::end,您需要#include &lt;iterator&gt;,对于std::min,可能需要&lt;algorithm&gt;

【讨论】:

    【解决方案4】:

    当然,您可以简单地从开头跳过三个元素。

    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 中可用。您可以轻松地将 begin() 和 end() 与 const_iterator 一起使用。

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多