问题:检查向量中的连续元素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;
}
Run Code Online (Sandbox Code Playgroud)
问题:
for(auto &i: v)我如何使用索引来比较两个连续的元素?for(int i = 0; j < v.size();i++)
{
if(v[i] < v[i+1] + 1){cout << "ok" << endl;}
}
Run Code Online (Sandbox Code Playgroud)
此循环具有未定义的行为,您在最后一个索引v[i+1]时访问i.你需要条件i+1 < v.size()
- 通过使用for(auto&i:v)我如何使用索引来比较两个连续的元素?
因为std::vector保证具有连续存储,所以在使用基于范围的for循环时可以访问下一个元素:
for (auto& i : v)
if (i < *(&i+1) + 1) {cout << "ok" << endl;}
Run Code Online (Sandbox Code Playgroud)
然而,这与你的for循环有同样的问题,它将访问向量的过去,并且在这种情况下无法停止它,因为for如果你想停止迭代你不能使用基于范围的循环在范围结束之前.你需要这样做:
size_t count = 0;
for (auto& i : v)
if (++count < v.size() && i < *(&i+1) + 1) {cout << "ok" << endl;}
Run Code Online (Sandbox Code Playgroud)
此时你也可以使用普通for循环,它更简单,更清晰.
- 我不想在源代码中使用第二个for循环,因为矢量大小可能会改变.通过使用自动我不必担心元素是否被删除,矢量调整大小是正确的吗?
没有!你不能使用基于范围的for循环来进行任何时髦的循环,例如迭代正在被修改的向量,它只是从固定范围的第一个元素到最后一个元素,没什么特别的.
如果在修改向量时尝试使用它,则它将离开向量的末尾,或者如果向量增长并重新分配,则基于范围的循环在后台使用的迭代器将变为无效.
如果你需要做一些比仅依次访问每个元素更复杂的事情,那么不要使用基于范围的for循环.