迭代嵌套" for"仅在"特定的"指数。 C ++

时间:2015-02-03 22:29:29

标签: c++ for-loop iteration nested-loops

我有4个嵌套" for"环路。

     for(int i=0; i<len1; i++) {
      for(int j=0; j<len2; j++) {
       for(int k=0; k<len1; k++) {
        for(int l=0; l<len2; l++) {
          //perform some calculations/operations.
        }
       }
      }
     }

问题是,整个代码将遍历每个&#34; for&#34;的每个索引。循环从0到len1 / len2。我不希望它这样做。相反,我希望这些循环迭代某些特定的&#34;索引并跳过其余的(通过跳过我的意思是TOTAL跳过,它不应该迭代不需要的索引)。

为了给出更详细的解释,以下是运行上述代码片段时迭代的发生方式。

i    j    k    l
0    0    0    0
0    0    0    1
0    0    0    2
0    0    0    3
.    .    .    .
.    .    .    .
.    .    .    .
len1 len2 len1 len2

但我想要的是以下......

0    0    0    63
0    0    0    450
0    0    0    569
0    0    3    87
0    0    78   999
.    .    .    .
.    .    .    .
.    .    .    .
29   65   99   357
29   66   21   222
.    .    .    .

依旧...... 首先是嵌套&#34; for&#34;环

其次,最重要的是我只想用嵌套的&#34; for&#34;循环。没有其他方法。

第三,对#34;特定&#34;的迭代。我想要的指数不是随机的。

3 个答案:

答案 0 :(得分:0)

如果您可以根据外部循环定义内部循环的起点,请确保。例如:

for(int i=0; i<len1; i++) {
  for(int j=0; j<len2; j++) {
   for(int k=0; k<len1; k++) {
    int lStart = DetermineBasedOn(i, j, k);
    for(int l=lStart; l<len2; l++) {
      //perform some calculations/operations.
    }
   }
  }
 }

请注意

DetermineBasedOn(i, j, k);

不一定是实际的方法调用。您可以在循环体中设置起始索引。

如果在迭代的区域中需要 gap ,请在评论中按照@SamIAm的建议执行:提供一个函数来确定下一个索引(尽管可能基于多个变量:

for(int l=lStart; l<len2; l = GetNextIndex(l, i, j, k)) {

您可以使用相同的技术提前结束内部循环(例如设置lEnd并使用它代替len2)。

  

其次,最重要的是我只想用嵌套的&#34; for&#34;循环。没有其他方法。

dowhile循环在功能上等同于for循环,在这种情况下可能(或可能不)更清晰,更容易阅读。我不确定为什么偏向于其他循环结构,但你可以用fordowhile完成相同的结果。

答案 1 :(得分:0)

将您的特定索引放入std::vector,并循环显示以获得您的真实指数。使用C ++ 11,您可以使用以下语法初始化向量。

std::vector myFavoriteIndices = {5,7, 11, 8}

for(int i = 0; i < len1; i++) {
    for(int j = 0; j < len2; j++) {
        for(int k = 0; k < len1; k++) {
            for(int l = 0; l < myFavoriteIndices.size(); l++) {
                int trueIndex = myFavoriteIndices[l];
                // do something with trueIndex
            }
        }
    }
}

答案 2 :(得分:0)

如果我理解正确,你想要迭代某些索引(你有一个确定的方法吗?)。

如果您可以预先确定所需的索引,那么您可以使用索引向量。

类似的东西:

 vector<int> iIdx;
 vector<int> jIdx;
 vector<int> kIdx;
 vector<int> lIdx;

 // your inside algorithm section which determines what indexes are needed for each 
 ...
 lIdx.push_back(63);
 ...

 // the new loop
 for (int i=0;i<iIdx.size();i++)
  for (int j=0;j<jIdx.size();j++)
    for (int k=0;k<kIdx.size();k++)
      for (int l=0;l<lIdx.size();l++)
        {
            ii = iIdx[i];
            jj = jIdx[j]; 
            kk = kIdx[k]; 
            ll = lIdx[l];
            // use ii , jj ,kk and ll as you would use i,j,k,l on your original question
        }

如果您有办法在quad循环开始之前确定这些索引,则此方法有效。

否则,你可以通过这种方法减少一些循环,你可以生成索引(例如,如果你需要知道i和j来生成k和l的索引,那么只有kIdx和lIdx将使用以上方法)。

编辑:

其他评论中注明您使用CUDA。

您可以在CPU上计算iIdx,jIdx,kIdx和lIdx数组,并在GPU上进行for循环。