由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - C++怎么写任意重重循环?
相关主题
相关话题的讨论汇总
话题: int话题: vars话题: do话题: void话题: 循环
进入Programming版参与讨论
1 (共1页)
z****e
发帖数: 2024
1
要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
is there any way i can do this more easily?
btw, the question is all about c++ syntax, and C++ programming technique,
language features.
Nothing about why i need to do this and how to improve this mathematically
is irrelevant.
Thanks 大牛们。
早谢了。
X****r
发帖数: 3557
2
for (int i = 0; i < 65536; i++) {
int i1 = (i & 3) + 1;
int i2 = ((i >> 2) & 3) + 1;
int i3 = ((i >> 4) & 3) + 1;
int i4 = ((i >> 6) & 3) + 1;
int i5 = ((i >> 8) & 3) + 1;
int i6 = ((i >> 10) & 3) + 1;
int i7 = ((i >> 12) & 3) + 1;
int i8 = ((i >> 14) & 3) + 1;
// ...
}

technique,
mathematically

【在 z****e 的大作中提到】
: 要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
: i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
: is there any way i can do this more easily?
: btw, the question is all about c++ syntax, and C++ programming technique,
: language features.
: Nothing about why i need to do this and how to improve this mathematically
: is irrelevant.
: Thanks 大牛们。
: 早谢了。

X****r
发帖数: 3557
3
一个更通用的方法:
int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
int k;
do {
// do your stuff with i[0] to i[7]
for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
} while (k < 8);

technique,
mathematically

【在 z****e 的大作中提到】
: 要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
: i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
: is there any way i can do this more easily?
: btw, the question is all about c++ syntax, and C++ programming technique,
: language features.
: Nothing about why i need to do this and how to improve this mathematically
: is irrelevant.
: Thanks 大牛们。
: 早谢了。

z****e
发帖数: 2024
4
这看得我惊呆了。
有没有什么模板的方法,可以好多重循环,任意重的,可能不?
你这个通用的,和上面那个,我要好好理解一下,目前还消化不了。

【在 X****r 的大作中提到】
: 一个更通用的方法:
: int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
: int k;
: do {
: // do your stuff with i[0] to i[7]
: for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
: } while (k < 8);
:
: technique,
: mathematically

X****r
发帖数: 3557
5
任意重的当然可以用这个方法,要不然怎么说更通用呢:
void multi_loop(int *from, int *to, int n,
void (*callback)(const int *, int)) {
int *i = new int[n];
int k;
for (k = 0; k < n; k++) {
i[k] = from[k];
}
do {
(*callback)(i, n);
for (k = 0; k < n && ++i[k] > to[k]; k++) {
i[k] = from[k];
}
} while (k < n);
delete[] i;
}

【在 z****e 的大作中提到】
: 这看得我惊呆了。
: 有没有什么模板的方法,可以好多重循环,任意重的,可能不?
: 你这个通用的,和上面那个,我要好好理解一下,目前还消化不了。

t****t
发帖数: 6806
6
make it template:
template
void multi_loop(const T* from, const T* to, int n, F f)
{
T* i=new T[n];
std::copy(from, from+n, i);
int k;
do {
f(i);
for (k = 0; k < n && ++i[k] > to[k]; i[k] = from[k], k++);
while (k delete [] i;
}

【在 X****r 的大作中提到】
: 任意重的当然可以用这个方法,要不然怎么说更通用呢:
: void multi_loop(int *from, int *to, int n,
: void (*callback)(const int *, int)) {
: int *i = new int[n];
: int k;
: for (k = 0; k < n; k++) {
: i[k] = from[k];
: }
: do {
: (*callback)(i, n);

t****t
发帖数: 6806
7
(shouldn't use i[k++]=from[k] as it's undefined...)

【在 X****r 的大作中提到】
: 任意重的当然可以用这个方法,要不然怎么说更通用呢:
: void multi_loop(int *from, int *to, int n,
: void (*callback)(const int *, int)) {
: int *i = new int[n];
: int k;
: for (k = 0; k < n; k++) {
: i[k] = from[k];
: }
: do {
: (*callback)(i, n);

X****r
发帖数: 3557
8
你说得对,抄下来的时候没看。
这样的话i[k] = from[k]放到for循环内部,
留k++作为for循环的第三个表达式好看一些。

【在 t****t 的大作中提到】
: (shouldn't use i[k++]=from[k] as it's undefined...)
b******u
发帖数: 469
9
orz.

【在 X****r 的大作中提到】
: 一个更通用的方法:
: int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
: int k;
: do {
: // do your stuff with i[0] to i[7]
: for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
: } while (k < 8);
:
: technique,
: mathematically

a**u
发帖数: 813
10
using recursive functions to do it.

【在 z****e 的大作中提到】
: 要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
: i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
: is there any way i can do this more easily?
: btw, the question is all about c++ syntax, and C++ programming technique,
: language features.
: Nothing about why i need to do this and how to improve this mathematically
: is irrelevant.
: Thanks 大牛们。
: 早谢了。

相关主题
进入Programming版参与讨论
z****e
发帖数: 2024
11
发现自己太愚蠢了,目前为止,一个方法也没有完全理解。
墙呢,你在哪?
z****e
发帖数: 2024
12
发现自己太愚蠢了,目前为止,一个方法也没有完全理解。
墙呢,你在哪?
z****e
发帖数: 2024
13
句弱智疑问,
from, to ,都是代表啥?没想明白。尤其++i[k] > to[k],简直是神来之笔,不是很懂。
那个f,就是我要干的事情是吧?一个需要所有变量排列的函数对吧?
我真要撞墙了,这么多解法,我就真是一个都没有理解。
原来还以为自己C++已经有感觉了呢。

【在 t****t 的大作中提到】
: make it template:
: template
: void multi_loop(const T* from, const T* to, int n, F f)
: {
: T* i=new T[n];
: std::copy(from, from+n, i);
: int k;
: do {
: f(i);
: for (k = 0; k < n && ++i[k] > to[k]; i[k] = from[k], k++);

t****t
发帖数: 6806
14
比如你要从11111循环到44444, 那from就是11111,to就是44444.
呃, 其实没有"这么多解法", 通用的解法就贴了一个, 其余的都是语法变化.
想要理解其实很容易, 你想想如果是你手工从一个排列产生下一个排列, 是怎么做的?
换个更特殊的例子, 如果你要从000循环到999, 你怎么做? 数数会的吧?
把最后一位加1, 如果>9就回到0, 再把前一位加1, 如果>9就回到0, 如此循环.
把这句话翻译成C, 就是xentar的那一行for(...)了.

懂。

【在 z****e 的大作中提到】
: 句弱智疑问,
: from, to ,都是代表啥?没想明白。尤其++i[k] > to[k],简直是神来之笔,不是很懂。
: 那个f,就是我要干的事情是吧?一个需要所有变量排列的函数对吧?
: 我真要撞墙了,这么多解法,我就真是一个都没有理解。
: 原来还以为自己C++已经有感觉了呢。

C**********n
发帖数: 100
15
问个弱问题,用了这个很牛的解法之后,复杂度有没有改进?
是不是还是和多重循环嵌套一样?

?

【在 t****t 的大作中提到】
: 比如你要从11111循环到44444, 那from就是11111,to就是44444.
: 呃, 其实没有"这么多解法", 通用的解法就贴了一个, 其余的都是语法变化.
: 想要理解其实很容易, 你想想如果是你手工从一个排列产生下一个排列, 是怎么做的?
: 换个更特殊的例子, 如果你要从000循环到999, 你怎么做? 数数会的吧?
: 把最后一位加1, 如果>9就回到0, 再把前一位加1, 如果>9就回到0, 如此循环.
: 把这句话翻译成C, 就是xentar的那一行for(...)了.
:
: 懂。

t****t
发帖数: 6806
16

没有.
是.

【在 C**********n 的大作中提到】
: 问个弱问题,用了这个很牛的解法之后,复杂度有没有改进?
: 是不是还是和多重循环嵌套一样?
:
: ?

z****e
发帖数: 2024
17
我理解了,并且把你和红猪侠的方法都代码验证了一下。
受益匪浅呀。高兴的要撞墙了。
另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
f(i);
我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?

?

【在 t****t 的大作中提到】
: 比如你要从11111循环到44444, 那from就是11111,to就是44444.
: 呃, 其实没有"这么多解法", 通用的解法就贴了一个, 其余的都是语法变化.
: 想要理解其实很容易, 你想想如果是你手工从一个排列产生下一个排列, 是怎么做的?
: 换个更特殊的例子, 如果你要从000循环到999, 你怎么做? 数数会的吧?
: 把最后一位加1, 如果>9就回到0, 再把前一位加1, 如果>9就回到0, 如此循环.
: 把这句话翻译成C, 就是xentar的那一行for(...)了.
:
: 懂。

l******e
发帖数: 12192
18
你duke哪个系的?

【在 z****e 的大作中提到】
: 我理解了,并且把你和红猪侠的方法都代码验证了一下。
: 受益匪浅呀。高兴的要撞墙了。
: 另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
: f(i);
: 我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
: 脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
: 我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?
:
: ?

t****t
发帖数: 6806
19
撞墙男, 那个callback只是给你看一下的, 不是重点. 加不加size都无所谓, 因为
caller知道尺寸, callback也很容易知道.
另外delete[]一般是把尺寸放在内存块的前面.

【在 z****e 的大作中提到】
: 我理解了,并且把你和红猪侠的方法都代码验证了一下。
: 受益匪浅呀。高兴的要撞墙了。
: 另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
: f(i);
: 我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
: 脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
: 我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?
:
: ?

t****t
发帖数: 6806
20
啥时候xentar变成红猪侠了, 红猪侠不是个写手吗?

【在 z****e 的大作中提到】
: 我理解了,并且把你和红猪侠的方法都代码验证了一下。
: 受益匪浅呀。高兴的要撞墙了。
: 另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
: f(i);
: 我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
: 脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
: 我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?
:
: ?

相关主题
进入Programming版参与讨论
l******e
发帖数: 12192
21
为啥是男的?

【在 t****t 的大作中提到】
: 撞墙男, 那个callback只是给你看一下的, 不是重点. 加不加size都无所谓, 因为
: caller知道尺寸, callback也很容易知道.
: 另外delete[]一般是把尺寸放在内存块的前面.

t****t
发帖数: 6806
22
缺省值?

【在 l******e 的大作中提到】
: 为啥是男的?
z****e
发帖数: 2024
23
lol

【在 t****t 的大作中提到】
: 缺省值?
h*****0
发帖数: 4889
24
写C语言的习惯就是多句话写成一句,读起来非常不爽。关键就是那个for循环,我写开
给你看:
for (k = 0; k < n; k++) {
i[k]++; // 自增1
if (i[k] > MAX[k]) {
i[k] = MIN[k]; // 要进位了,这位清0吧
} else {
break; //不用进位,所以结束了。
}
}
这下明白了吧?

【在 z****e 的大作中提到】
: 发现自己太愚蠢了,目前为止,一个方法也没有完全理解。
: 墙呢,你在哪?

h*****0
发帖数: 4889
25
这个跟c++无关,是c语言的基础。

懂。

【在 z****e 的大作中提到】
: 句弱智疑问,
: from, to ,都是代表啥?没想明白。尤其++i[k] > to[k],简直是神来之笔,不是很懂。
: 那个f,就是我要干的事情是吧?一个需要所有变量排列的函数对吧?
: 我真要撞墙了,这么多解法,我就真是一个都没有理解。
: 原来还以为自己C++已经有感觉了呢。

w**********s
发帖数: 291
26
一个容易理解的方法:利用stl里面的permutation,找出所有四个数组Index的排列组
合,然后对每个排列组合进行你的操作。
O*******d
发帖数: 20343
27
How about "要8个变量,都遍历一遍,每个从 0 to 2" ?
w**********s
发帖数: 291
28
遍历8个数组,就是找出8个数组index的排列组合吧?
这个stl可以完成。寻找完全的排列组合,应该说对n重循环提供了一个比较简洁的方法
。这里最啰嗦的事情交给stl来漂亮地完成了。
h*****0
发帖数: 4889
29
stl里的排列包括“可重复排列”?如11211

【在 w**********s 的大作中提到】
: 遍历8个数组,就是找出8个数组index的排列组合吧?
: 这个stl可以完成。寻找完全的排列组合,应该说对n重循环提供了一个比较简洁的方法
: 。这里最啰嗦的事情交给stl来漂亮地完成了。

t****t
发帖数: 6806
30
显然没有嘛, 题都没看清

【在 h*****0 的大作中提到】
: stl里的排列包括“可重复排列”?如11211
相关主题
进入Programming版参与讨论
v*s
发帖数: 946
31
看别人的喜欢这样的程序。
自己的喜欢写成一行,显摆。

【在 h*****0 的大作中提到】
: 写C语言的习惯就是多句话写成一句,读起来非常不爽。关键就是那个for循环,我写开
: 给你看:
: for (k = 0; k < n; k++) {
: i[k]++; // 自增1
: if (i[k] > MAX[k]) {
: i[k] = MIN[k]; // 要进位了,这位清0吧
: } else {
: break; //不用进位,所以结束了。
: }
: }

O*******d
发帖数: 20343
32
在学校里写程序,别人越读不懂,就越有自豪感。
在公司里写程序,写得别人读不懂,公司里的大牛会让你重写。

【在 v*s 的大作中提到】
: 看别人的喜欢这样的程序。
: 自己的喜欢写成一行,显摆。

h*****0
发帖数: 4889
33
本来就应该写得容易懂。
能写出容易懂的代码,能读懂难懂的代码才是牛人,而不是反过来。

【在 O*******d 的大作中提到】
: 在学校里写程序,别人越读不懂,就越有自豪感。
: 在公司里写程序,写得别人读不懂,公司里的大牛会让你重写。

z****e
发帖数: 2024
34
我不太能读懂难的代码,但是我写的代码一定都容易懂,我算啥呢?

【在 h*****0 的大作中提到】
: 本来就应该写得容易懂。
: 能写出容易懂的代码,能读懂难懂的代码才是牛人,而不是反过来。

O*******d
发帖数: 20343
35
Big cow to be.

【在 z****e 的大作中提到】
: 我不太能读懂难的代码,但是我写的代码一定都容易懂,我算啥呢?
a****l
发帖数: 8211
36
能保证自己写的东西别人很容易看懂就是一个小牛了.

【在 O*******d 的大作中提到】
: Big cow to be.
O*******d
发帖数: 20343
37
Big cow to be, 后备大牛。

【在 a****l 的大作中提到】
: 能保证自己写的东西别人很容易看懂就是一个小牛了.
h*****0
发帖数: 4889
38
半个牛人。

【在 z****e 的大作中提到】
: 我不太能读懂难的代码,但是我写的代码一定都容易懂,我算啥呢?
s*******d
发帖数: 1027
39
k < 8 && ++i[k] > 4 是怎么run的?没看明白。。

【在 X****r 的大作中提到】
: 一个更通用的方法:
: int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
: int k;
: do {
: // do your stuff with i[0] to i[7]
: for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
: } while (k < 8);
:
: technique,
: mathematically

z****e
发帖数: 2024
40
进位。

【在 s*******d 的大作中提到】
: k < 8 && ++i[k] > 4 是怎么run的?没看明白。。
相关主题
进入Programming版参与讨论
b*********n
发帖数: 1258
41
这里不是很明白
可以解释一下为什么i[k++]=from[k]是undefined吗?

【在 t****t 的大作中提到】
: (shouldn't use i[k++]=from[k] as it's undefined...)
h*****0
发帖数: 4889
42
可以等效成:
i[k] = from [k];
k++;
也可能效果是:
i[k] = from[k + 1];
k++;

【在 b*********n 的大作中提到】
: 这里不是很明白
: 可以解释一下为什么i[k++]=from[k]是undefined吗?

z****e
发帖数: 2024
43
要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
is there any way i can do this more easily?
btw, the question is all about c++ syntax, and C++ programming technique,
language features.
Nothing about why i need to do this and how to improve this mathematically
is irrelevant.
Thanks 大牛们。
早谢了。
X****r
发帖数: 3557
44
for (int i = 0; i < 65536; i++) {
int i1 = (i & 3) + 1;
int i2 = ((i >> 2) & 3) + 1;
int i3 = ((i >> 4) & 3) + 1;
int i4 = ((i >> 6) & 3) + 1;
int i5 = ((i >> 8) & 3) + 1;
int i6 = ((i >> 10) & 3) + 1;
int i7 = ((i >> 12) & 3) + 1;
int i8 = ((i >> 14) & 3) + 1;
// ...
}

technique,
mathematically

【在 z****e 的大作中提到】
: 要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
: i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
: is there any way i can do this more easily?
: btw, the question is all about c++ syntax, and C++ programming technique,
: language features.
: Nothing about why i need to do this and how to improve this mathematically
: is irrelevant.
: Thanks 大牛们。
: 早谢了。

X****r
发帖数: 3557
45
一个更通用的方法:
int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
int k;
do {
// do your stuff with i[0] to i[7]
for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
} while (k < 8);

technique,
mathematically

【在 z****e 的大作中提到】
: 要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
: i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
: is there any way i can do this more easily?
: btw, the question is all about c++ syntax, and C++ programming technique,
: language features.
: Nothing about why i need to do this and how to improve this mathematically
: is irrelevant.
: Thanks 大牛们。
: 早谢了。

z****e
发帖数: 2024
46
这看得我惊呆了。
有没有什么模板的方法,可以好多重循环,任意重的,可能不?
你这个通用的,和上面那个,我要好好理解一下,目前还消化不了。

【在 X****r 的大作中提到】
: 一个更通用的方法:
: int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
: int k;
: do {
: // do your stuff with i[0] to i[7]
: for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
: } while (k < 8);
:
: technique,
: mathematically

X****r
发帖数: 3557
47
任意重的当然可以用这个方法,要不然怎么说更通用呢:
void multi_loop(int *from, int *to, int n,
void (*callback)(const int *, int)) {
int *i = new int[n];
int k;
for (k = 0; k < n; k++) {
i[k] = from[k];
}
do {
(*callback)(i, n);
for (k = 0; k < n && ++i[k] > to[k]; k++) {
i[k] = from[k];
}
} while (k < n);
delete[] i;
}

【在 z****e 的大作中提到】
: 这看得我惊呆了。
: 有没有什么模板的方法,可以好多重循环,任意重的,可能不?
: 你这个通用的,和上面那个,我要好好理解一下,目前还消化不了。

t****t
发帖数: 6806
48
make it template:
template
void multi_loop(const T* from, const T* to, int n, F f)
{
T* i=new T[n];
std::copy(from, from+n, i);
int k;
do {
f(i);
for (k = 0; k < n && ++i[k] > to[k]; i[k] = from[k], k++);
while (k delete [] i;
}

【在 X****r 的大作中提到】
: 任意重的当然可以用这个方法,要不然怎么说更通用呢:
: void multi_loop(int *from, int *to, int n,
: void (*callback)(const int *, int)) {
: int *i = new int[n];
: int k;
: for (k = 0; k < n; k++) {
: i[k] = from[k];
: }
: do {
: (*callback)(i, n);

t****t
发帖数: 6806
49
(shouldn't use i[k++]=from[k] as it's undefined...)

【在 X****r 的大作中提到】
: 任意重的当然可以用这个方法,要不然怎么说更通用呢:
: void multi_loop(int *from, int *to, int n,
: void (*callback)(const int *, int)) {
: int *i = new int[n];
: int k;
: for (k = 0; k < n; k++) {
: i[k] = from[k];
: }
: do {
: (*callback)(i, n);

X****r
发帖数: 3557
50
你说得对,抄下来的时候没看。
这样的话i[k] = from[k]放到for循环内部,
留k++作为for循环的第三个表达式好看一些。

【在 t****t 的大作中提到】
: (shouldn't use i[k++]=from[k] as it's undefined...)
相关主题
进入Programming版参与讨论
b******u
发帖数: 469
51
orz.

【在 X****r 的大作中提到】
: 一个更通用的方法:
: int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
: int k;
: do {
: // do your stuff with i[0] to i[7]
: for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
: } while (k < 8);
:
: technique,
: mathematically

a**u
发帖数: 813
52
using recursive functions to do it.

【在 z****e 的大作中提到】
: 要8个变量,都遍历一遍,每个从 1 to 4, need 4^8= 65536.
: i need to define i1,i2,i3,...i8, then start 8 nested "for" loops.
: is there any way i can do this more easily?
: btw, the question is all about c++ syntax, and C++ programming technique,
: language features.
: Nothing about why i need to do this and how to improve this mathematically
: is irrelevant.
: Thanks 大牛们。
: 早谢了。

z****e
发帖数: 2024
53
发现自己太愚蠢了,目前为止,一个方法也没有完全理解。
墙呢,你在哪?
z****e
发帖数: 2024
54
发现自己太愚蠢了,目前为止,一个方法也没有完全理解。
墙呢,你在哪?
z****e
发帖数: 2024
55
句弱智疑问,
from, to ,都是代表啥?没想明白。尤其++i[k] > to[k],简直是神来之笔,不是很懂。
那个f,就是我要干的事情是吧?一个需要所有变量排列的函数对吧?
我真要撞墙了,这么多解法,我就真是一个都没有理解。
原来还以为自己C++已经有感觉了呢。

【在 t****t 的大作中提到】
: make it template:
: template
: void multi_loop(const T* from, const T* to, int n, F f)
: {
: T* i=new T[n];
: std::copy(from, from+n, i);
: int k;
: do {
: f(i);
: for (k = 0; k < n && ++i[k] > to[k]; i[k] = from[k], k++);

t****t
发帖数: 6806
56
比如你要从11111循环到44444, 那from就是11111,to就是44444.
呃, 其实没有"这么多解法", 通用的解法就贴了一个, 其余的都是语法变化.
想要理解其实很容易, 你想想如果是你手工从一个排列产生下一个排列, 是怎么做的?
换个更特殊的例子, 如果你要从000循环到999, 你怎么做? 数数会的吧?
把最后一位加1, 如果>9就回到0, 再把前一位加1, 如果>9就回到0, 如此循环.
把这句话翻译成C, 就是xentar的那一行for(...)了.

懂。

【在 z****e 的大作中提到】
: 句弱智疑问,
: from, to ,都是代表啥?没想明白。尤其++i[k] > to[k],简直是神来之笔,不是很懂。
: 那个f,就是我要干的事情是吧?一个需要所有变量排列的函数对吧?
: 我真要撞墙了,这么多解法,我就真是一个都没有理解。
: 原来还以为自己C++已经有感觉了呢。

C**********n
发帖数: 100
57
问个弱问题,用了这个很牛的解法之后,复杂度有没有改进?
是不是还是和多重循环嵌套一样?

?

【在 t****t 的大作中提到】
: 比如你要从11111循环到44444, 那from就是11111,to就是44444.
: 呃, 其实没有"这么多解法", 通用的解法就贴了一个, 其余的都是语法变化.
: 想要理解其实很容易, 你想想如果是你手工从一个排列产生下一个排列, 是怎么做的?
: 换个更特殊的例子, 如果你要从000循环到999, 你怎么做? 数数会的吧?
: 把最后一位加1, 如果>9就回到0, 再把前一位加1, 如果>9就回到0, 如此循环.
: 把这句话翻译成C, 就是xentar的那一行for(...)了.
:
: 懂。

t****t
发帖数: 6806
58

没有.
是.

【在 C**********n 的大作中提到】
: 问个弱问题,用了这个很牛的解法之后,复杂度有没有改进?
: 是不是还是和多重循环嵌套一样?
:
: ?

z****e
发帖数: 2024
59
我理解了,并且把你和红猪侠的方法都代码验证了一下。
受益匪浅呀。高兴的要撞墙了。
另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
f(i);
我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?

?

【在 t****t 的大作中提到】
: 比如你要从11111循环到44444, 那from就是11111,to就是44444.
: 呃, 其实没有"这么多解法", 通用的解法就贴了一个, 其余的都是语法变化.
: 想要理解其实很容易, 你想想如果是你手工从一个排列产生下一个排列, 是怎么做的?
: 换个更特殊的例子, 如果你要从000循环到999, 你怎么做? 数数会的吧?
: 把最后一位加1, 如果>9就回到0, 再把前一位加1, 如果>9就回到0, 如此循环.
: 把这句话翻译成C, 就是xentar的那一行for(...)了.
:
: 懂。

l******e
发帖数: 12192
60
你duke哪个系的?

【在 z****e 的大作中提到】
: 我理解了,并且把你和红猪侠的方法都代码验证了一下。
: 受益匪浅呀。高兴的要撞墙了。
: 另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
: f(i);
: 我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
: 脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
: 我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?
:
: ?

相关主题
进入Programming版参与讨论
t****t
发帖数: 6806
61
撞墙男, 那个callback只是给你看一下的, 不是重点. 加不加size都无所谓, 因为
caller知道尺寸, callback也很容易知道.
另外delete[]一般是把尺寸放在内存块的前面.

【在 z****e 的大作中提到】
: 我理解了,并且把你和红猪侠的方法都代码验证了一下。
: 受益匪浅呀。高兴的要撞墙了。
: 另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
: f(i);
: 我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
: 脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
: 我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?
:
: ?

t****t
发帖数: 6806
62
啥时候xentar变成红猪侠了, 红猪侠不是个写手吗?

【在 z****e 的大作中提到】
: 我理解了,并且把你和红猪侠的方法都代码验证了一下。
: 受益匪浅呀。高兴的要撞墙了。
: 另外,金无足赤,你那个模板的方法有一个小小的瑕疵,很小很小,就是
: f(i);
: 我觉得还是f(int* , size_t n)好些。毕竟函数不知道new的那个数组多大,我知道电
: 脑知道,因为delete的时候需要知道,但是我不知道电脑怎么知道的。
: 我不知道你知不知道电脑怎么知道被销毁的那个new的数组原来多大的?
:
: ?

l******e
发帖数: 12192
63
为啥是男的?

【在 t****t 的大作中提到】
: 撞墙男, 那个callback只是给你看一下的, 不是重点. 加不加size都无所谓, 因为
: caller知道尺寸, callback也很容易知道.
: 另外delete[]一般是把尺寸放在内存块的前面.

t****t
发帖数: 6806
64
缺省值?

【在 l******e 的大作中提到】
: 为啥是男的?
z****e
发帖数: 2024
65
lol

【在 t****t 的大作中提到】
: 缺省值?
h*****0
发帖数: 4889
66
写C语言的习惯就是多句话写成一句,读起来非常不爽。关键就是那个for循环,我写开
给你看:
for (k = 0; k < n; k++) {
i[k]++; // 自增1
if (i[k] > MAX[k]) {
i[k] = MIN[k]; // 要进位了,这位清0吧
} else {
break; //不用进位,所以结束了。
}
}
这下明白了吧?

【在 z****e 的大作中提到】
: 发现自己太愚蠢了,目前为止,一个方法也没有完全理解。
: 墙呢,你在哪?

h*****0
发帖数: 4889
67
这个跟c++无关,是c语言的基础。

懂。

【在 z****e 的大作中提到】
: 句弱智疑问,
: from, to ,都是代表啥?没想明白。尤其++i[k] > to[k],简直是神来之笔,不是很懂。
: 那个f,就是我要干的事情是吧?一个需要所有变量排列的函数对吧?
: 我真要撞墙了,这么多解法,我就真是一个都没有理解。
: 原来还以为自己C++已经有感觉了呢。

w**********s
发帖数: 291
68
一个容易理解的方法:利用stl里面的permutation,找出所有四个数组Index的排列组
合,然后对每个排列组合进行你的操作。
O*******d
发帖数: 20343
69
How about "要8个变量,都遍历一遍,每个从 0 to 2" ?
w**********s
发帖数: 291
70
遍历8个数组,就是找出8个数组index的排列组合吧?
这个stl可以完成。寻找完全的排列组合,应该说对n重循环提供了一个比较简洁的方法
。这里最啰嗦的事情交给stl来漂亮地完成了。
相关主题
进入Programming版参与讨论
h*****0
发帖数: 4889
71
stl里的排列包括“可重复排列”?如11211

【在 w**********s 的大作中提到】
: 遍历8个数组,就是找出8个数组index的排列组合吧?
: 这个stl可以完成。寻找完全的排列组合,应该说对n重循环提供了一个比较简洁的方法
: 。这里最啰嗦的事情交给stl来漂亮地完成了。

t****t
发帖数: 6806
72
显然没有嘛, 题都没看清

【在 h*****0 的大作中提到】
: stl里的排列包括“可重复排列”?如11211
O*******d
发帖数: 20343
73
在学校里写程序,别人越读不懂,就越有自豪感。
在公司里写程序,写得别人读不懂,公司里的大牛会让你重写。

【在 v*s 的大作中提到】
: 看别人的喜欢这样的程序。
: 自己的喜欢写成一行,显摆。

h*****0
发帖数: 4889
74
本来就应该写得容易懂。
能写出容易懂的代码,能读懂难懂的代码才是牛人,而不是反过来。

【在 O*******d 的大作中提到】
: 在学校里写程序,别人越读不懂,就越有自豪感。
: 在公司里写程序,写得别人读不懂,公司里的大牛会让你重写。

z****e
发帖数: 2024
75
我不太能读懂难的代码,但是我写的代码一定都容易懂,我算啥呢?

【在 h*****0 的大作中提到】
: 本来就应该写得容易懂。
: 能写出容易懂的代码,能读懂难懂的代码才是牛人,而不是反过来。

O*******d
发帖数: 20343
76
Big cow to be.

【在 z****e 的大作中提到】
: 我不太能读懂难的代码,但是我写的代码一定都容易懂,我算啥呢?
a****l
发帖数: 8211
77
能保证自己写的东西别人很容易看懂就是一个小牛了.

【在 O*******d 的大作中提到】
: Big cow to be.
O*******d
发帖数: 20343
78
Big cow to be, 后备大牛。

【在 a****l 的大作中提到】
: 能保证自己写的东西别人很容易看懂就是一个小牛了.
h*****0
发帖数: 4889
79
半个牛人。

【在 z****e 的大作中提到】
: 我不太能读懂难的代码,但是我写的代码一定都容易懂,我算啥呢?
s*******d
发帖数: 1027
80
k < 8 && ++i[k] > 4 是怎么run的?没看明白。。

【在 X****r 的大作中提到】
: 一个更通用的方法:
: int i[8] = {1, 1, 1, 1, 1, 1, 1, 1}
: int k;
: do {
: // do your stuff with i[0] to i[7]
: for (k = 0; k < 8 && ++i[k] > 4; i[k++] = 1);
: } while (k < 8);
:
: technique,
: mathematically

相关主题
进入Programming版参与讨论
z****e
发帖数: 2024
81
进位。

【在 s*******d 的大作中提到】
: k < 8 && ++i[k] > 4 是怎么run的?没看明白。。
b*********n
发帖数: 1258
82
这里不是很明白
可以解释一下为什么i[k++]=from[k]是undefined吗?

【在 t****t 的大作中提到】
: (shouldn't use i[k++]=from[k] as it's undefined...)
h*****0
发帖数: 4889
83
可以等效成:
i[k] = from [k];
k++;
也可能效果是:
i[k] = from[k + 1];
k++;

【在 b*********n 的大作中提到】
: 这里不是很明白
: 可以解释一下为什么i[k++]=from[k]是undefined吗?

r****o
发帖数: 1950
84
我现在很喜欢把超过3层循环的code都用这种方法改写,这样用2层循环就够了。
不过我想知道,改写之后除了循环次数少了之后还有什么其他好处吗?
我想来想去,好像就感觉代码量少了些,好像效率没有大的提高?
大牛们怎么看这个问题?
是不是循环次数少了会导致效率高点呢?Cache? 流水线?并行
欢迎拍砖。

【在 h*****0 的大作中提到】
: 写C语言的习惯就是多句话写成一句,读起来非常不爽。关键就是那个for循环,我写开
: 给你看:
: for (k = 0; k < n; k++) {
: i[k]++; // 自增1
: if (i[k] > MAX[k]) {
: i[k] = MIN[k]; // 要进位了,这位清0吧
: } else {
: break; //不用进位,所以结束了。
: }
: }

d***a
发帖数: 13752
85
呵呵,想起我高中时写Basic程序,写过这样的code。
"好像效率没有大的提高":一般来说,效率要比原来稍低一些(假设C编程),因为循
环变量用i[0], i[1], i[2]等,比用i0, i1, i2的overhead大一点。主要的好处是灵活
,因为数组的长度可以做成可变的,这样做N层循环时,N不必是一个常数。

【在 r****o 的大作中提到】
: 我现在很喜欢把超过3层循环的code都用这种方法改写,这样用2层循环就够了。
: 不过我想知道,改写之后除了循环次数少了之后还有什么其他好处吗?
: 我想来想去,好像就感觉代码量少了些,好像效率没有大的提高?
: 大牛们怎么看这个问题?
: 是不是循环次数少了会导致效率高点呢?Cache? 流水线?并行
: 欢迎拍砖。

m*********t
发帖数: 527
86
我觉得这个才应该被贴出来。前面把一堆东西挤在一行又没有改变复杂度。。。 I don
't see the point

【在 h*****0 的大作中提到】
: 写C语言的习惯就是多句话写成一句,读起来非常不爽。关键就是那个for循环,我写开
: 给你看:
: for (k = 0; k < n; k++) {
: i[k]++; // 自增1
: if (i[k] > MAX[k]) {
: i[k] = MIN[k]; // 要进位了,这位清0吧
: } else {
: break; //不用进位,所以结束了。
: }
: }

r****o
发帖数: 1950
87
不懂为啥用数组就会效率稍低?
另外,循环层数低了,是不是从cache的角度来讲会效率稍微高些?

【在 d***a 的大作中提到】
: 呵呵,想起我高中时写Basic程序,写过这样的code。
: "好像效率没有大的提高":一般来说,效率要比原来稍低一些(假设C编程),因为循
: 环变量用i[0], i[1], i[2]等,比用i0, i1, i2的overhead大一点。主要的好处是灵活
: ,因为数组的长度可以做成可变的,这样做N层循环时,N不必是一个常数。

d***a
发帖数: 13752
88
i, j, k这样的循环变量,一般就直接用寄存器了,循环变量的访问不牵涉到内存。用
数组式的循环变量,就要访问内存了。对这个数组的访问,还要用一个循环变量。
只有几层的循环层数,用不用数组,对cache没什么影响。源代码看上去大了不少,似
乎要多占cache,但实际上,机器代码只多一点(每层多两条或三条机器指令)。

【在 r****o 的大作中提到】
: 不懂为啥用数组就会效率稍低?
: 另外,循环层数低了,是不是从cache的角度来讲会效率稍微高些?

s*****V
发帖数: 21731
89
这个就是 几进制吧, 如果是1-4 就是4进制。从 1111 遍历到 4444.
r****o
发帖数: 1950
90
像下面这样的多层循环是不是也有一个hidden loop在里面,比如说当i1=1,i2=i3=i4=9
, i4再增加的时候,它要先比较i3,i2,而不是直接跳到i1。对吧?
for (i1=0;i1<10;i1++)
for (i2=0;i2<10;i2++)
for (i3=0;i3<10;i3++)
for (i4=0;i4<10;i4++)
{
}

【在 d***a 的大作中提到】
: i, j, k这样的循环变量,一般就直接用寄存器了,循环变量的访问不牵涉到内存。用
: 数组式的循环变量,就要访问内存了。对这个数组的访问,还要用一个循环变量。
: 只有几层的循环层数,用不用数组,对cache没什么影响。源代码看上去大了不少,似
: 乎要多占cache,但实际上,机器代码只多一点(每层多两条或三条机器指令)。

相关主题
进入Programming版参与讨论
t****t
发帖数: 6806
91
try focus on something else instead of this crap.

=9

【在 r****o 的大作中提到】
: 像下面这样的多层循环是不是也有一个hidden loop在里面,比如说当i1=1,i2=i3=i4=9
: , i4再增加的时候,它要先比较i3,i2,而不是直接跳到i1。对吧?
: for (i1=0;i1<10;i1++)
: for (i2=0;i2<10;i2++)
: for (i3=0;i3<10;i3++)
: for (i4=0;i4<10;i4++)
: {
: }

i********r
发帖数: 131
92
thinking in c++11 and a more general solution:
#include
#include
using namespace std;
void do_something(const vector& vars)
{
cout << "do_something with loop variables: ";
for (auto& i: vars)
cout << i << " ";
cout << endl;
}
void myLoop(vector& vars)
{
do_something(vars);
}
template
void myLoop(vector& vars, unsigned int n, Args... args)
{
auto index = vars.size();
vars.push_back(0);
for (auto i = 0; i < n; ++i) {
vars[index] = i;
myLoop(vars, args...);
}
vars.erase(vars.end() - 1);
}
template
void variadicLoops(unsigned int n, Args... args)
{
vector vars;
myLoop(vars, n, args...);
}
// build: g++ -std=c++0x a.cpp (require 4.6.3 or above)
int main()
{
cout << "using variadic templates" << endl;
variadicLoops(2, 3);
variadicLoops(2, 3, 4);
// variadicLoops(); // compile error, which is good
return 0;
}
i********r
发帖数: 131
93
If the number of loops are only known at run time, the variadic template won
't work. The only way I can think of is recursion:
#include
#include
using namespace std;
void do_something(const vector& vars)
{
cout << "do_something with loop variables: ";
for (auto& i: vars)
cout << i << " ";
cout << endl;
}
// method 2:
void myLoop(const vector& inputs, vector& vars)
{
if (inputs.size() == vars.size()) {
do_something(vars);
} else {
auto index = vars.size();
vars.push_back(0);
for (auto i = 0; i < inputs[index]; ++i) {
vars[index] = i;
myLoop(inputs, vars);
}
vars.erase(vars.end() - 1);
}
}
void variadicLoops(const vector& inputs)
{
if (inputs.size() != 0) {
vector vars;
myLoop(inputs, vars);
}
}
int main()
{
cout << "using recursive function" << endl;
vector inputs;
variadicLoops(inputs); // do nothing but compile ok
inputs.push_back(2);
inputs.push_back(3);
variadicLoops(inputs);
inputs.push_back(4);
variadicLoops(inputs);
return 0;
}
1 (共1页)
进入Programming版参与讨论
相关主题
相关话题的讨论汇总
话题: int话题: vars话题: do话题: void话题: 循环