从任何位置开始迭代整个数组,仅使用一个变量
Iterate over full array starting at any position, using only one variable
相当简单,我想只使用一个var进行循环,遍历arraysize
数组的每个索引。 我有一种方法可以使用两个 var i
和 j
来做到这一点,其中 i
跟踪实际索引并循环并j
计数到 arraysize 并终止循环:
for (unsigned int i = start, j = 0; //start is the starting index
j < arraysize;
++i == arraysize ? i = 0 : 0, ++j)
{
//do stuff
}
有没有一些漂亮的方法可以只用i
做到这一点? 顺序无关紧要,如果由于某种原因向后迭代有意义。
澄清:我想从start
循环到arraysize - 1
,然后从0
循环到start - 1
。
至少据我了解,你想遍历整个数组,但你想从开头以外的其他地方开始,然后当你到达终点时,你想从头开始并继续前进,直到你到达原始起点。
假设这是正确的,这很容易:
for (size_t i=0; i<arraysize; i++)
process(array[(i+start)%arraysize]);
我更愿意将该算法抽象为通用函数(甚至可以在std::forward_list
之类的事情上工作),而无需进行多余的模和加法运算(尽管在许多情况下它们是可以接受的):
#include <algorithm>
#include <iostream>
#include <iterator>
template<typename FwdIter, typename F>
F for_each_shifted(FwdIter first, FwdIter start, FwdIter last, F f)
{
using std::for_each;
return for_each(first, start, for_each(start, last, f));
}
int main()
{
using namespace std;
int v[] = { 1, 1, 2, 6, 24 };
for_each_shifted(begin(v), begin(v) + 3, end(v), [](int x)
{
cout << x << endl;
});
}
输出为:
6
24
1
1
2
现场演示
for ( i=start; i<start+arraysize; i++ ) {
// do stuff with (i % arraysize) in place of i
}
for (size_t i = start; (i + 1) % arraysize != start: i = (i + 1) % arraysize) {
// stuff
}
这会让你到达那里:
for (unsigned int i = start; i < start + arraySize; i++)
{
DoSomething(array[i % arraySize]);
}
或者:
for (unsigned int i = 0; i < arraySize; i++)
{
DoSomething(array[(i + start) % arraySize]);
}
例如,您可以使用 folloing 循环语句
for ( int i = start; i < arraysize + start; i++ )
在循环体内部而不是我使用表达式 i % 数组大小
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 用C++中的一个变量定义一个常量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 如何从另一个文件继承私有成员变量和公共函数
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 全局变量 多读取器 一个写入器多线程安全?
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 一个变量的输入值也会保存到另一个变量中
- 从另一个 cpp 文件更改结构内、映射键内的变量
- 在另一个函数 (c++) 中调用变量
- 将双精度变量设置为另一个变量的值
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如果我注释掉换行符,为什么'string'会成为一个不合格的变量
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- C++使用cin给变量一个非整数的值
- 怎么可能有两个同名的变量——一个是全局变量,另一个是局部变量