使用迭代器比较 Vector 中的连续元素

compare successive elements in Vector by using Iterator

本文关键字:连续 元素 Vector 迭代器 比较      更新时间:2023-10-16

问题:检查向量中的连续元素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 &i: v)如何使用索引来比较两个连续的元素?
  • 我不想在源代码中使用第二个 for 循环,因为矢量大小可能会改变。通过使用 auto,我不必担心元素是否被删除并且矢量是否被调整大小,对吗?
for(int i = 0; j < v.size();i++)
{
    if(v[i] < v[i+1] + 1){cout << "ok" << endl;}
}

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

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

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

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

但是,这与for循环具有相同的问题,它将访问向量的过去末尾,在这种情况下,无法停止它,因为如果您想在范围结束之前停止迭代,则无法使用基于范围的for循环。您需要执行以下操作:

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

在这一点上,你不妨只使用一个普通的for循环,它更简单、更清晰。

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

不!您不得将基于范围的for循环用于任何时髦的事情,例如迭代正在修改的向量,它只是从固定范围的第一个元素到最后一个元素,没有什么花哨的。

如果你尝试在修改向量时使用它,那么它要么会离开向量的末端,要么如果向量增长并重新分配,那么基于范围的循环在幕后使用的迭代器将失效。

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

或者

你可以保持简单。如果你无论如何都必须在循环外声明一个变量,那么你可以只写:

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

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