【问题标题】:compare successive elements in Vector by using Iterator使用迭代器比较 Vector 中的连续元素
【发布时间】:2014-12-09 14:51:24
【问题描述】:

问题:检查向量中的连续元素if v[i] < v[i+1] + 1

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int>v{1,2,3,4,5,6,7,8,9,10};
    for(auto &i: v)
    {
        cout << (i+1) << endl;
    }
    //SIMILAR TO THIS FOR LOOP
    for(int i = 0; i < v.size() - 1;i++)
    {
        if(v[i] < v[i+1] + 1){cout << "ok" << endl;}
    }
    return 0;
}

问题:

  • 通过使用for(auto &amp;i: v)如何使用索引来比较两个连续的元素?
  • 我不想在源代码中使用第二个 for 循环,因为矢量 size 可能会改变。通过使用 auto,我不必担心元素是否被删除并且矢量是否会调整大小,对吗?

【问题讨论】:

  • 你今天或多或少不能。也许将来我们会得到类似python的zip
  • 你不能。 i 不是迭代器。使用带有迭代器或索引的常规 for 循环。
  • 有些事情你不能用基于范围的 for 循环来做。在这种情况下使用迭代器
  • 您的for 循环具有未定义的行为,当i 是最后一个索引时,您访问v[i+1]
  • //////////////////del

标签: c++ vector


【解决方案1】:
for(int i = 0; j < v.size();i++)
{
    if(v[i] < v[i+1] + 1){cout << "ok" << endl;}
}

此循环具有未定义的行为,当i 是最后一个索引时,您访问v[i+1]。您需要条件为i+1 &lt; v.size()

  • 通过使用 for(auto &i: v) 如何使用索引来比较两个连续的元素?

因为std::vector 保证有连续存储,所以在使用基于范围的for 循环时可以访问下一个元素:

for (auto& i : v)
  if (i < *(&i+1) + 1) {cout << "ok" << endl;}

但是,这与您的 for 循环有相同的问题,它将访问向量的末尾,在这种情况下,无法停止它,因为您不能使用基于范围的 @ 987654329@ 循环,如果你想在范围结束之前停止迭代。你需要这样做:

size_t count = 0;
for (auto& i : v)
  if (++count < v.size() && i < *(&i+1) + 1) {cout << "ok" << endl;}

而此时你不妨只使用一个普通的for 循环,它更简单明了。

  • 我不想在源代码中使用第二个 for 循环,因为向量大小可能会改变。通过使用 auto,我不必担心元素是否被擦除并且矢量是否会调整大小,对吗?

不!您不得使用基于范围的for 循环来处理任何奇怪的事情,例如迭代正在修改的向量,它只是从第一个元素到固定范围的最后一个元素,没什么特别的。

如果您在向量被修改时尝试使用它,那么它将离开向量的末尾,或者如果向量增长并重新分配,那么基于范围的循环在后台使用的迭代器将失效.

如果您需要做一些比依次访问每个元素更复杂的事情,那么不要使用基于范围的for 循环

【讨论】:

    【解决方案2】:

    或者你可以保持简单。如果你必须在循环外声明一个变量,你可以写:

    int index = 0;  
    for (auto &i : v)
    {
        if (index + 1 < v.size() && i < v[++index] + 1) { cout << "ok" << endl; }
    }
    

    我认为v[++index] 可能比*(&amp;i+1) + 1 快一点。

    【讨论】:

    • v.size() == 1 这有未定义的行为。我希望*(&amp;i+1) 更快,因为编译器知道它是与i 相邻的元素。它更难知道iv[index] 是同一个元素。
    • @JonathanWakely 不再。
    • index &lt; v.size() &amp;&amp; i &lt; v[++index] + 1 应该是 index + 1 &lt; v.size() &amp;&amp; i &lt; v[++index] + 1 并且 v.size() &gt; 1 是不必要的
    • @BeyelerStudios,你说得对!
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 2015-09-27
    • 2010-09-20
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多