【问题标题】:What is this piece of c++ code doing?这段 C++ 代码在做什么?
【发布时间】:2009-08-03 16:04:25
【问题描述】:

我不知道这段代码的工作原理和原因:

// postorder dfs
Iterator< Index<String<char> >, TopDown<ParentLink<Postorder> > >::Type
     myIterator(myIndex);
while (goDown(myIterator));
for (; !atEnd(myIterator); goNext(myIterator)) 
// do something with myIterator ( Traverse Through (Suffix)-tree )

这是来自seqan 的示例,接口在此处描述:API

  1. while 对 for 循环有何影响?
  2. 为什么没有初始化 for 循环?

【问题讨论】:

  • 这里不涉及元编程。并非所有模板的使用都是元编程。
  • 我认为模板元编程最糟糕的事情是现在很多人似乎认为任何带有模板的代码都是元编程的一个例子。
  • Type Iterator&lt; Index&lt;String&lt;char&gt; &gt;, TopDown&lt;ParentLink&lt;Postorder&gt; &gt; &gt;::Type 可以很好地使用元程序计算
  • -1 表示没有选择答案。

标签: c++ seqan


【解决方案1】:

您已经了解了 C++ 的有趣部分 - 在语法上有效但难以为人类解析的技术中使用语言结构。

while (goDown(myIterator));

这将“goDown(myIterator)”直到它返回 false。然后它将继续进入 for 循环。它什么都没有循环——但这没关系,因为函数 goDown 正在工作。

for (; !atEnd(myIterator); goNext(myIterator)) 

这不会初始化任何东西,但会测试它不是 atEnd(myIterator) - 虽然它不是,但它会 goNext(myIterator)。它也可以写成一个while循环,让它更容易理解:

while(!atEnd(myIterator)) 
{
    goNext(myIterator));
}

所以代码会:

  1. 向下直到 goDown() 返回 false - 这意味着 goDown 每次都在修改 myIterator
  2. goNext() 直到 atEnd()

【讨论】:

    【解决方案2】:

    显然,goDowngoNext 正在通过引用来获取他们的论点并对其进行修改。所以你的两个问题的答案是,1.while 多次调用goDown,改变myIterator,这就是你所说的间接影响,因为 2.@987654326 @ 以 myIterator 开头,与 while 留下的完全一样——所以它当然不会重新分配它,这将撤消所有的工作!

    【讨论】:

      猜你喜欢
      • 2015-01-16
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多