仅对"specific"索引迭代嵌套"for"循环。C++

Iterate nested "for" loops only over "specific" indices. C++

本文关键字:循环 C++ for 迭代 specific 索引 仅对 嵌套      更新时间:2023-10-16

>我有 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.
        }
       }
      }
     }

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

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

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
.    .    .    .

等等...首先,嵌套的"for"循环是否可行?

其次,也是最重要的,我只想使用嵌套的"for"循环来做到这一点。没有其他方法。

第三,我想要的"特定"索引的迭代不是随机的。

如果我理解正确,您希望迭代某些索引(您有确定的方法?

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

像这样:

 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
        }

如果您有办法在四元循环启动之前确定这些索引,则此方法有效。

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

编辑:

在其他评论中指出您使用 CUDA。

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

如果你能根据外循环来定义内循环的起点,那当然可以。 例:

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);

不必是实际的方法调用。 您可以在循环主体中设置开始索引。

如果您需要迭代区域中的间隙,请按照注释中@SamIAm的建议进行操作: 提供一个函数来确定下一个索引(尽管可能基于多个变量:

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

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

其次,也是最重要的,我只想使用嵌套的"for"循环来做到这一点。没有其他方法。

dowhile 循环在功能上等同于for循环,在这种情况下可能(也可能不)更清晰、更易于阅读。 我不确定为什么对其他循环结构有偏见,但您当然可以用for实现与dowhile相同的结果。

将你的特定索引放入一个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
            }
        }
    }
}