C++ 避免原始循环,而是使用std::algorithm

C++ 避免原始循环,而是使用std::algorithm,c++,c++11,stl-algorithm,C++,C++11,Stl Algorithm,除其他地方外,我试图遵循给出的建议,避免原始循环,而是使用std::algorithm。因此,如果可能的话,在以下情况下,您能帮助我做到这一点,我将不胜感激: std::stringstream ss; std::vector<Object> v; for (const auto& curr : v) { ss << curr.ToString() << '\n'} return ss.str() std::stringstream-ss; std:

除其他地方外,我试图遵循给出的建议,避免原始循环,而是使用
std::algorithm
。因此,如果可能的话,在以下情况下,您能帮助我做到这一点,我将不胜感激:

std::stringstream ss;
std::vector<Object> v;
for (const auto& curr : v) { ss << curr.ToString() << '\n'}
return ss.str()
std::stringstream-ss;
std::向量v;

对于(const auto&curr:v){ss当然,您可以运行:

std::for_each(v.begin(), v.end(), [&](const Object& o) { ss << o.ToString() << '\n'; });

std::对于_each(v.begin()、v.end()、[&](const Object&o){ss这非常简洁:

std::copy(v.begin(), v.end(), std::ostream_iterator<Object>(std::cout, "\n"));
std::copy(v.begin()、v.end()、std::ostream_迭代器(std::cout,“\n”);
只有当操作员 我试图遵循这里给出的建议,避免使用原始循环,而是使用std::algorithm

你为什么要这么做

Sean Parent在他演讲的前七分钟左右使用的例子确实是一个糟糕得可怕的代码示例。代码非常复杂,而且一直在重复。然而,将带有嵌套逻辑的多个
for
循环的乱七八糟的情况翻译成对算法库的各种调用可能是错误的更糟糕的是,家长错过了最重要的编码准则(幽默地阅读):

总是把你的代码写得像一个知道你住在哪里的精神变态的blub程序员一样

如果你是一名优秀的程序员,你必须克制自己的欲望,使你的代码尽可能智能、酷、紧凑,而不是让其他人阅读你的代码。当你成为一名优秀的程序员时,这种克制就变得自然了

<>我并不是说你需要把你的代码降到它变成C的水平,而不是C++。换句话说,考虑到一个优秀的程序员,必须考虑到读写和维护代码的可怜的BLB程序员。在你努力成为一个优秀的程序员的时候,你的目标是编写代码,为所有简洁的代码设置一个例子。d高效,但同时也是显而易见的,并且非常容易理解


这可能意味着使用C++实用程序、算法和类型特征库的最深和最黑暗的角落的冲动。

只是出于好奇:你希望从这里使用一个算法有什么好处?我的意思是“代码>自动<代码>和基于一个基于范围的循环,你的代码已经被C++所获得了,你可以使用它。与任何其他容器循环,而不更改其上的任何内容。据我所知,算法的最大好处是它们可以在任何容器上工作,但您的代码已经是这样了。请看一下
std::ostream_iterator
@tobi303,我并不确定。只是尝试遵循建议,可能是错误的:)“避免原始循环”听起来像是Sean Parent的引用,或者是基于他的谈话/工作的引用。Parent自己允许一些琐碎的正确循环,比如代码中的循环。我同意这个循环很好,不需要人为地用一些算法来代替。我看了视频,29:40左右,他论证了基于范围的for循环比al循环更可取gorithm(特别是每个我很喜欢这个答案。一个人不应该盲目地听从建议,并在建议起反作用的地方应用它。请注意,肖恩非常清楚,这是一个指导方针,而不是一个要求。@MarshallClow--我在回答中说这是一个要求吗?我说这更糟:我说这是一个糟糕的指导方针。Func对于大多数C++程序员来说,编程是一种外来的范例。我已经用LISP编程了,我对函数编程非常熟悉。我的C++多数成员都不是。我已经学会了我要扼杀我从LISP学到的一些很酷的课程。恐怕你误读了他的信息。他从来不提倡算法库。算法库。指南中最重要的部分是循环是一种算法。它做了一些重要的事情。它应该有一个名字。请理解它的功能,将它分离出来,并将其纳入函数中。消息中不太重要的部分是STL确实有许多有用的算法,您可以使用你把ostream和操作符搞混了&而且,如果我们有
操作符的话
std::copy(v.begin(), v.end(), std::ostream_iterator<Object>(std::cout, "\n"));
std::ostream& operator<<(std::ostream& ostr, const Object& obj)
{
    return ostr << obj.ToString();
}