[英]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(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.