首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-07-16 
请教一种for的循环实现方式?for(int row 0 row GW.numRows() row++){for(int fld 0/*fld如果是1,

请教一种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里面的泛型算法

热点排行