重构 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++,但我相信您已经了解了大致的想法。

最新更新