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

时间:2022-02-15 02:42:58
	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,是不是有更好的办法呢?

8 个解决方案

#1


写成一个函数就好了

#2


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];
      //……
  }

#3


此外,如果你真想要一个“fld如果是1,4,8,12,14为条件ture”也很简单:



  if ((( 1 << fld ) & 0x5112)!=0)
  {
  }


不这这种判断……不加注释的话会让人比较头痛,还不如干脆使用==和&&写一个组合表达式。更好的方法是用位操作实现一个整数集合对象,在这个条件判断中使用集合的include判断。

#4


引用 2 楼 u010936098 的回复:
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];
      //……
  }

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

#5


嗯,如果支持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

#6


用查表的方式。

引用 楼主 u011345631 的回复:
	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,是不是有更好的办法呢?

#7


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++;
        }
    }
}

#8


可以用STL里面的泛型算法

#1


写成一个函数就好了

#2


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];
      //……
  }

#3


此外,如果你真想要一个“fld如果是1,4,8,12,14为条件ture”也很简单:



  if ((( 1 << fld ) & 0x5112)!=0)
  {
  }


不这这种判断……不加注释的话会让人比较头痛,还不如干脆使用==和&&写一个组合表达式。更好的方法是用位操作实现一个整数集合对象,在这个条件判断中使用集合的include判断。

#4


引用 2 楼 u010936098 的回复:
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];
      //……
  }

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

#5


嗯,如果支持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

#6


用查表的方式。

引用 楼主 u011345631 的回复:
	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,是不是有更好的办法呢?

#7


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++;
        }
    }
}

#8


可以用STL里面的泛型算法