使用迭代器比较 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 循环,因为矢量大小可能会改变。通过使用 auto,我不必担心元素是否被删除并且矢量是否被调整大小,对吗?
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 循环,因为矢量大小可能会改变。通过使用 auto,我不必担心元素是否被删除并且矢量是否被调整大小,对吗?
不!您不得将基于范围的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
快一点.
相关文章:
- 我应该如何表示我拥有的连续元素序列?
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 是否存在一个范围::视图::group_by对应项,它将所有元素都考虑在内,而不是只考虑连续的元素
- 结构化绑定,无需复制即可获取子向量的连续元素
- 确定数组是否可以旋转 3 个连续的数组元素进行排序?
- C++指向连续矢量元素的指针是矛盾的
- 如何比较C 列表中的两个连续元素
- 将解决方案打印为数组中非连续元素的最大总和
- AVX2 根据条件将连续元素扩展到稀疏向量?(如AVX512 VP扩展)
- 是否有任何方法可以比较C 中的STD ::的两个连续元素
- 如何在c++中增加向量中k个连续元素的值
- C++用于将函数应用于连续元素的算法
- 阵列中连续元素的总和C
- 一种按排序顺序保持元素的数据结构,支持快速插入和计算连续元素之间的最大差异
- 如何在for循环中同时使用deque的两个连续元素
- 使用迭代器比较 Vector 中的连续元素
- 在 N 个元素的数组中求出"P"元素的最小和,以便一起选择不超过"k"个连续元素
- 计算(列表中)连续元素的最大和
- 计算一个向量中不重复的连续元素的最大数目.c++
- 如何生成不会产生超过 X 个连续元素的随机数序列