147
|
missingfaktor Kevin Wright · 技术社区 · 15 年前 |
![]() |
1
161
和…的好事情 C++11 (先前称之为C++0X)是这个令人厌烦的辩论将被解决。 我的意思是,没有一个头脑清醒的人,想要迭代整个集合,仍然会使用这个
或者这个
当
基于距离
这种语法在Java和C语言中已经有一段时间了,实际上还有更多的方法。
|
![]() |
2
46
以下是一些原因:
更新1:
最重要的是,它能帮助你超越
很多处理过程可以用for-each的兄弟姐妹的“其余部分”非常简洁地编写,但是如果您所做的只是用各种内部逻辑编写for循环,那么您将永远不会学习如何使用这些循环,最终您将一次又一次地发明轮子。 和(即将推出的每个系列的款式):
或者用C++ X11 lambdas:
IMO的可读性是否高于:
此外(或与lambdas一起,请参阅其他内容):
比以下内容更简洁:
尤其是如果您有几个函数需要按顺序调用…但也许只有我。;) 更新2 :我已经编写了自己的一行STL算法包装器,它使用范围而不是一对迭代器。BooG::RangeEX EX,一旦发布,将包括它,也许它也会出现在C++0X中吗? |
![]() |
3
22
因为每个都更通用。您可以使用它在任何类型的容器上迭代(通过传入begin/end迭代器)。您可以在每个函数下面交换容器,而不必更新迭代代码。您需要考虑世界上除了std::vector和普通的旧C数组之外还有其他容器,以了解它们各自的优势。 for-each的主要缺点是它需要一个函数,所以语法比较繁琐。这是固定在C++0x中引入LAMBDAS:
这在3年内不会让你觉得奇怪。 |
![]() |
4
17
就我个人而言,任何时候我都需要用我的方式
VS
|
![]() |
5
11
它非常主观,有人会说使用
所以,选择适合你的东西取决于你。 |
![]() |
6
10
与许多算法函数一样,最初的反应是认为使用foreach比使用循环更不可读。这是许多火焰战争的主题。 一旦你习惯了这个成语,你会发现它很有用。一个明显的优点是它强制编码人员将循环的内部内容与实际的迭代功能分开。(好吧,我认为这是一个优势。另一种说法是,你只是在断章取义,没有真正的好处)。 另一个好处是当我看到foreach时, 知道 将处理每个项或引发异常。 一 对于 循环允许终止循环的多个选项。您可以让循环运行其整个过程,也可以使用 打破 关键字以显式跳出循环,或使用 返回 关键字退出整个函数的中间循环。相反, 前额 不允许使用这些选项,这使其更具可读性。您只需浏览函数名,就可以了解迭代的完整性质。 下面是一个令人困惑的例子 对于 循环:
|
![]() |
7
9
你基本上是对的:大多数时候,
在标准算法中,
举个例子,我很肯定我已经不知道有多少次我看到人们用
他们的职位是询问
工作并打印出
幸运的是,还有更好的方法。为xxx添加一个普通的流插入器重载:
使用
这确实有效——而且几乎不需要任何工作就可以发现它打印了
|
![]() |
8
8
为了提高可读性而编写函数的优势可能不会在
如果您使用functional.h中的所有算法,而不是使用for循环,那么代码的可读性会提高很多;
是 许多的 可读性比;
这就是我认为的很好的地方,将for循环归纳为一行函数=) |
![]() |
9
5
容易的:
比…好
此外,范围
|
![]() |
10
4
这个
当前标准中可读性的问题是,它需要一个函数作为最后一个参数,而不是一个代码块,因此在许多情况下,必须为它编写特定的函数类型。由于无法就地定义函数对象(在函数中定义的本地类不能用作模板参数),因此会变成可读性较低的代码,并且循环的实现必须远离实际循环。
请注意,如果要对每个对象执行特定操作,可以使用
如果您确实有函数/方法要调用,那么它的可读性和紧凑性都不比手动版本差。该实现可以提供
即将到来的标准以不同的方式处理了一些缺点,它将允许本地定义的类作为模板的参数:
改进代码的位置:当你浏览时,你会看到它正在做什么。实际上,您甚至不需要使用类语法来定义函数,而是使用lambda:
即使对于
我倾向于混合
|
![]() |
11
3
除了可读性和性能,一个通常被忽视的方面是一致性。有许多方法可以实现for(或while)循环遍历迭代器,从:
到:
在不同的效率水平和潜在的缺陷之间有许多例子。 然而,使用for-each通过抽象循环来增强一致性:
现在你唯一需要担心的是:你使用Boost还是C++0X特性来实现循环体作为函数、函子或lambda?就个人而言,我宁愿担心这个问题,也不愿担心如何实现或读取一个随机的for/while循环。 |
![]() |
12
3
我以前不喜欢
这个
函子
在代码中,你只有一个像
所有这些函数通常都比长函数中间的显式for循环更容易接受单元测试,而这一点对我来说已经是一个巨大的胜利。
最后,编译器可能会为
同样适用于其他标准算法,如
|
![]() |
13
2
|
![]() |
14
2
如果您经常使用STL中的其他算法,那么
|
![]() |
15
2
用C++ 11和两个简单的模板,可以编写
代替
为了我,
你还是用三个表达式
模板是
|
![]() |
16
1
大多数情况下,你必须 迭代整个集合 . 因此,我建议您编写自己的for each()变量,只使用2个参数。这将允许您重写 Terry Mahaffey's example 作为:
我认为这确实比for循环更可读。但是,这需要C++0x编译器扩展。 |
![]() |
17
1
我发现每个人的可读性都不好。这个概念是好的,但是C++使它很难写可读,至少对我来说是如此。C++ 0xLAMDA表达式将有所帮助。我真的很喜欢拉姆达斯这个主意。不过,乍一看,我觉得语法很难看,我不完全肯定我会习惯它。也许5年后我会习惯的,不会再想一想,但也许不会。时间会证明:) 我更喜欢使用
我发现一个显式for循环更清晰地阅读和明确使用命名变量的开始和结束迭代器减少了for循环中的混乱。 当然情况不尽相同,这正是我通常认为最好的。 |
![]() |
18
0
您可以将迭代器作为对函数的调用,该函数通过循环在每次迭代时执行。 请参见此处: http://www.cplusplus.com/reference/algorithm/for_each/ |
![]() |
19
0
因为循环可能中断; 我不想成为Herb Sutter的鹦鹉,下面是他的演讲链接: http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-835T 请务必同时阅读评论:) |
![]() |
20
0
分叉连接模式
我们可以添加实现
和
Fluent接口它允许我们以简洁的方式编写人类可读的代码。
|
![]() |
Matt · 获取数组长度并推入每个对象 2 年前 |
![]() |
Pouya · Foreach循环不添加计数器 2 年前 |
![]() |
Andrea De Luca · 修改forEach中的元素使条目加倍 2 年前 |
![]() |
XFMW · 为什么我的foreach循环不能统一编译?[重复] 2 年前 |
![]() |
Red · 为什么我的字体大小不适合香草js? 2 年前 |
![]() |
aRTURIUS · Terraform for_每个问题的数据类型 3 年前 |
![]() |
Yerkin · 条件不适用于PHP和mysqli 3 年前 |