问题:检查向量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)
如何使用索引来比较两个连续的元素?答案 0 :(得分:6)
for(int i = 0; j < v.size();i++)
{
if(v[i] < v[i+1] + 1){cout << "ok" << endl;}
}
此循环具有未定义的行为,当v[i+1]
是最后一个索引时,您访问i
。您需要条件为i+1 < v.size()
- 使用for(auto&amp; 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
循环。
答案 1 :(得分:1)
或者你可以保持简单。如果你必须在循环之外声明一个变量,那么你可以写:
int index = 0;
for (auto &i : v)
{
if (index + 1 < v.size() && i < v[++index] + 1) { cout << "ok" << endl; }
}
我认为v[++index]
可能比*(&i+1) + 1
快一点。