【问题标题】:traversing a directory using loops使用循环遍历目录
【发布时间】:2013-08-04 16:32:19
【问题描述】:

我知道以前有人问过这个问题,但我有一个我正在考虑的具体例子。 目前我有一段代码,虽然是伪代码,因为我不在工作终端:

void setTree(string dir) {
    add dir to dirlist
    create dir object //contains list of subdirs and files
    for subdir in dir.subs do
        setTree(subdir)
    end
}

这是否可能仅与 for 循环有关,因为您无法在编译时知道编译时会有多少子目录。 伪代码很好或一些解释或算法。我真的不需要任何东西,因为我最喜欢我的递归解决方案,但我真的很想知道它是否可能。以及它背后的理论。

【问题讨论】:

  • 我会像 this 这样实现它。 Loki Astari 的回答也很好值得一读。
  • 在其文档中 Boost.Filesystem recursive_directory_iterator 的定义正下方,对其工作原理进行了简化说明。

标签: c++ for-loop recursion directory-structure


【解决方案1】:

有关理论,请参阅此处投票最多的答案:Can every recursion be converted into iteration?

实际上:

void setTree(string dir) {
   add dir to dirlist
   while (dirlist not empty) {
   d = dirlist.pop()
   create d object
   for subdir in d.subs do
      append subdir to dirlist
   end
   }
}

我尝试按照你的伪代码的奇怪语法混淆,希望它仍然可读。

【讨论】:

  • 很抱歉我的奇怪伪代码,最近 c 和 Lua 太多了。所以我们创建一个堆栈或队列之类的东西并弹出并推送东西到它上面?
  • 没问题 ;) 是的,完全正确。我认为任何展开到迭代中的典型递归都需要一个集合来代替堆栈跟踪,其中包含来自每个递归调用的所有参数。
【解决方案2】:

这取决于 dir 类的设计。如果子目录保存在数组或列表中,则可以将大小值用作 for 循环的最大值。该值将在运行时定义。如果子目录被保存,否则您可能必须使用while循环。

希望对您有所帮助 ChronosMOT

【讨论】:

    猜你喜欢
    • 2014-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多