Ron*_*Ron 4 c++ refactoring goto
大家好,我有一个代码,它位于一个迭代树的大循环中.这是我能得到这个例程的速度,但我必须使用goto.我并不是从根本上反对goto,但如果我能避免它们,我愿意.(请不要试图开始一场火焰战争.)
约束:
current=current->child()是昂贵的(这是一个shared_ptr)所以我想不惜一切代价尽量减少使用该操作.current应该是它找到的最后一个孩子.cnt 必须统计它遇到的每个孩子.代码:
insideloopy:
cnt++;
if ( current->hasChild() )
{
current = current->child();
goto insideloopy;
}
Run Code Online (Sandbox Code Playgroud)
编辑:对不起家伙,原本忘了提cnt ++应该只出现一次.它将是节点上的某种操作,因此应该只有一次.我也试图避免进行另一个函数调用.
Tho*_*rin 26
假设这是C或C++:
while (cnt++, current->hasChild())
{
current = current->child();
}
Run Code Online (Sandbox Code Playgroud)
我通常不是逗号操作员的忠实粉丝,但我不喜欢重复自己:)
在得知cnt++实际上是一些多线操作之后,这种特殊的语法将不太理想.你所接受答案的更多内容会更好.
如果你想要真的很时髦,这也会有效:
do
{
cnt++;
} while (current->hasChild() && (current = current->child()));
Run Code Online (Sandbox Code Playgroud)
现在我觉得很脏,我滥用了&&操作员的短路:)
除了紧凑的练习和争取可读的代码之外,我不得不得出结论,现有的答案之一是最合适的(我只是为了完整性而包括这个):
while (true)
{
cnt++;
if (!current->hasChild()) break;
current = current->child();
}
Run Code Online (Sandbox Code Playgroud)
该while (true)会由编译器优化成正无限循环,所以只有一个条件语句(如果你关心这一点).
唯一违反此解决方案的方法是,如果您的节点操作是一段很长的代码.我不介意无限循环,只要我能看到它们一目了然地终止.然后,如果它真的很长,它应该是一个功能无论如何.
Lor*_*nVS 18
cnt++;
while(current->hasChild())
{
cnt++;
current = current->child();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
如果你只想让cnt ++出现在你的代码中一次:
while(true)
{
cnt++;
if(current->hasChild())
current = current->child();
else
break;
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ini 11
insideloopy:
cnt++;
if ( current->hasChild() )
{
current = current->child();
goto insideloopy;
}
Run Code Online (Sandbox Code Playgroud)
我喜欢无限循环.
while (true) {
cnt++;
if (!current->hasChild()) break;
current = current->child();
}
Run Code Online (Sandbox Code Playgroud)
当然,你可以通过许多其他方式来做到这一点(见其他答案).做一会儿,把检查放进去等等.在我的解决方案中,我想几乎映射到你正在做的事情(无限的转到,除非休息)
| 归档时间: |
|
| 查看次数: |
663 次 |
| 最近记录: |