2009-08-03 234 views
1

我不知道如何和为什么这段代码的工作:这段C++代码在做什么?

// 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. 的同时,如何能影响换循环?
  2. 为什么不初始化for循环?
+1

这里没有涉及元编程。并非所有模板的使用都是元编程。 – 2009-08-03 16:19:52

回答

18

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

while (goDown(myIterator)); 

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

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

这不初始化任何东西,但经过检查,它不是atEnd(myIterator) - 虽然它不是,它会goNext(myIterator)。它也可以被写成while循环,使其slghtly更容易理解:

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

因此,代码将:

  1. 下去,直到仓库()返回false - 这意味着仓库正在修改myIterator每次
  2. goNext(),直到它是atEnd()
4

显然,goDowngoNext正在通过引用和改变他们的说法它。所以你的两个问题的答案是:1. while多次调用goDown,改变myIterator,因为它是你所谈论的间接影响,因为2. for开始于myIterator正如while离开它 - 当然,它不会重新分配它,这将消除所有的时间的工作!