仅对"specific"索引迭代嵌套"for"循环。C++
Iterate nested "for" loops only over "specific" indices. C++
>我有 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"循环来做到这一点。没有其他方法。
do
和 while
循环在功能上等同于for
循环,在这种情况下可能(也可能不)更清晰、更易于阅读。 我不确定为什么对其他循环结构有偏见,但您当然可以用for
实现与do
或while
相同的结果。
将你的特定索引放入一个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
}
}
}
}
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 循环后如何继续阅读
- Ardunio UNO解决了多个重叠的定时器循环
- Eigen如何在容器循环中干净地附加矩阵
- 在某些循环内使用vector.push_back时出现分段错误
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 为什么我的for循环不能正确获取argv
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- while循环中while循环的时间复杂度是多少
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 为什么在这个代码结束循环中没有得到结束
- 在基于范围的for循环中使用结构化绑定声明
- 用于C++中带有数组和指针的循环
- 循环中的随机函数
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 在循环C++中指定字符串之后,不会打印该字符串