读书人

请问一种for的循环实现方式

发布时间: 2013-07-16 22:38:05 作者: rapoo

请教一种for的循环实现方式?

for(int row = 0; row < GW.numRows(); row++)
{
for(int fld = 0;/*fld如果是1,4,8,12,14为条件ture*/; fld++)
{
if(strlen(GW.fieldValue(fld)) > 0)
{
cout <<GW.fieldValue(fld) << endl;
}
}
}



如果条件是1,4,8,12,14为条件确立,
我想到只能为逐个数字做if,是不是有更好的办法呢?
[解决办法]
for(int fld = 0;/*fld如果是1,4,8,12,14为条件ture*/; fld++)
那么fld初始值为0,条件为假,循环直接结束,一次都不会执行。


我想你的的应该是fld分别取值1,4,8,12,14吧,如果是这样,在不支持0x的编译器上应该这样:


for( int j = 0; j < 5; ++j)
{
static const int values[] = {1,4,8,12,14}
int fld = values[j];
//……
}

[解决办法]
引用:
for(int fld = 0;/*fld如果是1,4,8,12,14为条件ture*/; fld++)
那么fld初始值为0,条件为假,循环直接结束,一次都不会执行。


我想你的的应该是fld分别取值1,4,8,12,14吧,如果是这样,在不支持0x的编译器上应该这样:


for( int j = 0; j < 5; ++j)
{
static const int values[] = {1,4,8,12,14}
int fld = values[j];
//……
}

++
这个通用好,可以任意安排,也就占用一个数组的空间。时间上,性能也比差

[解决办法]
嗯,如果支持c++11,可以这样
template<typename T>
inline in(const std::initializer_list<T>& il, const T& val)
{
return std::find(il.begin(), il.end(), val) != il.end();
}


用法:
in({1,4,8,12,14}, fld);
可惜必须支持c++11的initializer_list
[解决办法]
用查表的方式。



引用:
for(int row = 0; row < GW.numRows(); row++)
{
for(int fld = 0;/*fld如果是1,4,8,12,14为条件ture*/; fld++)
{
if(strlen(GW.fieldValue(fld)) > 0)
{
cout <<GW.fieldValue(fld) << endl;
}
}
}



如果条件是1,4,8,12,14为条件确立,
我想到只能为逐个数字做if,是不是有更好的办法呢?

[解决办法]
for (A;B;C) D;
//等价于
{
A;
while (1) {
if (!(B)) break;
D;
C;
}
}

Release版默认速度优化,编译器会对switch语句作适当优化:
for(int row = 0; row < GW.numRows(); row++)
{
{
int fld=0,flag;
while (1) {
switch (fld) {
case 1:
case 4:
case 8:
case 12:
case 14:
flag=1;
break;
default:
flag=0;
}
if (!flag) break;
if(strlen(GW.fieldValue(fld)) > 0)
{
cout <<GW.fieldValue(fld) << endl;
}
fld++;


}
}
}


[解决办法]
可以用STL里面的泛型算法

读书人网 >C++

热点推荐