重构 C++ 中的特定嵌套循环
Refactoring specific nested loops in c++
我正在使用不支持目录高级目录操作的 c++ 框架 ( ROOT
(,所以当我在文件中生成我的(相当复杂(目录系统时,我通常最终会使用很多丑陋的嵌套 for 循环。我的问题是,是否有可能用一种不那么重复的方法替换这里显示的模式?使用像 lambda 这样接受其他 lambda 作为参数的东西,或者其他任何东西(链接的代码只是 dir 系统创建的一小部分(?
// Disk
t_outputFile -> cd("ROC_efficiency_disk_level_comparison");
gDirectory -> mkdir(layerDirName);
for(std::size_t sideIndex = 0, maxSideIndex = sideNames.size(); sideIndex < maxSideIndex; ++sideIndex)
{
const char* sideDirName = sideNames[sideIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> mkdir(sideDirName);
gDirectory -> cd(sideDirName);
for(std::size_t diskIndex = 0, diskMaxIndex = diskNames.size(); diskIndex < diskMaxIndex; ++diskIndex)
{
const char* diskDirName = diskNames[diskIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> mkdir(diskDirName);
}
}
// Disk-ring
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> mkdir(layerDirName);
for(std::size_t sideIndex = 0, maxSideIndex = sideNames.size(); sideIndex < maxSideIndex; ++sideIndex)
{
const char* sideDirName = sideNames[sideIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> mkdir(sideDirName);
gDirectory -> cd(sideDirName);
for(std::size_t diskIndex = 0, diskMaxIndex = diskNames.size(); diskIndex < diskMaxIndex; ++diskIndex)
{
const char* diskDirName = diskNames[diskIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> mkdir(diskDirName);
gDirectory -> cd(diskDirName);
for(std::size_t ringIndex = 0, ringMaxIndex = ringNames.size(); ringIndex < ringMaxIndex; ++ringIndex)
{
const char* ringDirName = ringNames[ringIndex].c_str();
t_outputFile -> cd("ROC_efficiency_disk-ring_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> cd(diskDirName);
gDirectory -> mkdir(ringDirName);
}
}
}
// Blade
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> mkdir(layerDirName);
for(std::size_t sideIndex = 0, maxSideIndex = sideNames.size(); sideIndex < maxSideIndex; ++sideIndex)
{
const char* sideDirName = sideNames[sideIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> mkdir(sideDirName);
gDirectory -> cd(sideDirName);
for(std::size_t diskIndex = 0, diskMaxIndex = diskNames.size(); diskIndex < diskMaxIndex; ++diskIndex)
{
const char* diskDirName = diskNames[diskIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> mkdir(diskDirName);
gDirectory -> cd(diskDirName);
for(std::size_t ringIndex = 0, ringMaxIndex = ringNames.size(); ringIndex < ringMaxIndex; ++ringIndex)
{
const char* ringDirName = ringNames[ringIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> cd(diskDirName);
gDirectory -> mkdir(ringDirName);
gDirectory -> cd(ringDirName);
for(std::size_t bladeIndex = 0, bladeMaxIndex = bladeNames.size(); bladeIndex < bladeMaxIndex; ++bladeIndex)
{
const char* bladeDirName = bladeNames[bladeIndex].c_str();
t_outputFile -> cd("ROC_efficiency_blade_level_comparison");
gDirectory -> cd(layerDirName);
gDirectory -> cd(sideDirName);
gDirectory -> cd(diskDirName);
gDirectory -> cd(ringDirName);
gDirectory -> mkdir(bladeDirName);
}
}
}
}
对它的作用有一个易于理解的解释:它返回到文件中的根目录,然后在那里创建许多目录,每个目录都包含相同的子目录系统。不同情况下的深度是不同的,每次创建新的子目录时,程序必须先返回到根目录。
例:
├── FPix/
│ ├── Positive_Side
│ │ ├─ Disk_1
│ │ │ ├─ Ring_1
│ │ │ │ └─ Some_other_nested_levels
│ │ │ └─ Ring_2
│ │ │ └─ Some_other_nested_levels
│ │ ├─ Disk_2
│ │ │ ├─ Ring_1
│ │ │ │ └─ Some_other_nested_levels
│ │ │ └─ Ring_2
│ │ │ └─ Some_other_nested_levels
│ │ └─ ...
│ │ └─ Same_as_the_other_disks
│ │
│ └── Negative_side
│ └─ Same_as_the_positive_side
│
├── ROC_efficiency_disk_level_comparison
│ └─ The_nesting_here_only_goes_until_disks
│ └─ ...
│
├── ROC_efficiency_ring_level_comparison
│ └─ The_nesting_here_only_goes_until_rings
│ └─ ...
│
└── Many_many_other_directories_that_have_the_same_dirs_but_different_levels_of_nesting
您可以将已发布的示例结构定义为树,将根目录定义为根目录,将子文件夹定义为节点,将这些目录的子目录定义为这些节点的节点,等等(直到到达目录结构的末尾(。然后你可以做一些类似的事情
def treedir(root):
os.mkdir(root)
for son in nodes:
treedir(son)
这将生成整个结构,假设您正确定义了树。
编辑:我刚刚意识到我发布了python代码,而您正在使用C++,但我相信您已经了解了大致的想法。
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 了解嵌套循环打印星号图案
- 无法掌握嵌套循环的写作技巧
- 在 c++ 中实现嵌套循环的更短方法吗?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 2 个嵌套循环的时间复杂度
- 嵌套循环背后的逻辑
- 使用 %s C++嵌套循环
- 嵌套循环和重复迭代器
- 如何在 c++ 下使用嵌套循环和正则表达式降低时间复杂度?
- C++在乘法图中放置随机值(嵌套循环)
- 如何使用 OpenMP 减少嵌套循环?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 学习嵌套循环C++与示例混淆
- 如何在CUDA中嵌套循环
- std::vector上的嵌套循环
- 具有动态数组分配的OpenMP嵌套循环
- 两个嵌套循环的运行时间复杂性:二次型还是线性