【发布时间】:2022-01-08 09:48:05
【问题描述】:
我想通过一个给定的整数向量,找到一个整数,next和previous整数的值为0。
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> sample = { 0,3,0 };
for (int i : sample)
{
if (sample[i - 1] == sample[i + 1] == 0)
{
cout << "hello";
}
}
}
但是,我不断收到“向量下标超出范围”错误。我认为这是因为当i 为0 时,sample[-1] 不存在,与i = 2 相同。
有没有简单的解决方法?
【问题讨论】:
-
您的意思是使用基于索引的循环,例如
for (size_t i = 1; i < sample.size() - 1; ++i)? -
您误解了基于范围的
for。i是sample的值,而不是索引。也就是说,i的值将分别为0、3和0,而不是0、1和2。但是,您怀疑尝试访问sample[-1]不正确是有根据的,当您重写代码以使用索引时,您应该小心避免这种情况。 -
你的解释是错误的。
i被分配了0、3、0,而不是0、1、2,所以在sample[i]中使用它作为索引 不会不要做你认为应该做的事。 -
i不是从 0 到 size-1 的值。它不是一个索引。i是被迭代的当前值。在这种情况下,i的值是0、3,然后是0。此外,您的逻辑存在缺陷,因为它假定每个元素都是前后元素。如果i是 索引,那么当i是向量中的第一个或最后一个索引时,您将检查越界索引。 -
不幸的是,Ranged for 循环不允许您使用访问元素的索引;你可以使用迭代器,但不确定你是否已经了解了这些;否则,通过索引循环循环的“标准”可以工作。
if (sample.size() > 2u) { for (auto p1 = sample.begin(), p2 = p1 + 2; p2 != sample.end(); ++p1, ++p2) { if (*p1 == 0 && *p2 == 0) { std::cout << "hello"; } }}