繁体   English   中英

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

[英]compare successive elements in Vector by using Iterator

问题: 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循环,因为矢量大小可能会改变。 通过使用自动,我不必担心元素是否被删除以及矢量是否已调整大小,对吗?
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循环,因为矢量大小可能会改变。 通过使用自动,我不必担心元素是否被删除以及矢量是否已调整大小,对吗?

没有! 对于任何时髦的事情,例如迭代被修改的向量,都不能使用基于范围的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快一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM