我开始使用stl容器,因为当我需要列表,设置和映射的功能并且在我的编程环境中没有其他任何可用时它们非常方便.我并不关心它背后的想法.STL文档很有意思到功能等等.然后我跳过了阅读并且只是使用了容器.
但是昨天,我的假期仍在放松,我只是尝试了一下,想要更多的方式.所以我使用了转换功能(我可以为我鼓掌一下,谢谢你).
从学术角度来看,它看起来很有趣,而且很有效.但困扰我的是,如果你加强了对这些函数的使用,你需要成千上万的帮助程序类来处理代码中你想要做的大部分事情.程序的整个逻辑被切成小块.这种切片不是良好的编码习惯的结果; 这只是技术需求.有些东西,这让我的生活变得更加艰难.
我学到了很难的方法,你应该总是选择最简单的方法来解决手头的问题.我无法看到,例如,for_each函数正在为我做什么,证明在几个简单的代码行中使用辅助类是合理的,这些代码位于一个普通的循环中,这样每个人都可以看到正在发生的事情.
我想知道,你在考虑我的担忧?当你开始以这种方式工作并且习惯了之后改变主意时,你有没有像我一样看到它?我忽略了哪些好处?或者你只是像我一样忽略这些东西(并且可能继续这样做).
谢谢.
PS:我知道在boost中有一个真正的for_each循环.但我在这里忽略它,因为它只是一个方便的方式,我猜通常使用迭代器循环.
程序的整个逻辑被切成小块.这种切片不是良好编码习惯的结果.这只是技术需求.有些东西,这让我的生活变得更加艰难.
你是对的,在某种程度上.这就是为什么即将推出的C++标准修订版将添加lambda表达式,允许您执行以下操作:
std::for_each(vec.begin(), vec.end(), [&](int& val){val++;})
Run Code Online (Sandbox Code Playgroud)
但我也认为按照当前的要求分割代码往往是一个很好的编码习惯.您有效地将描述您要执行的操作的代码与将其应用于值序列的行为分开.这是一些额外的样板代码,有时它只是令人烦恼,但我认为它也经常导致良好,干净的代码.
今天做的就是这样:
int incr(int& val) { return val+1}
// and at the call-site
std::for_each(vec.begin(), vec.end(), incr);
Run Code Online (Sandbox Code Playgroud)
我们只用一行描述:而不是通过完整的循环膨胀调用站点:
所以它更短,并传达与循环相同的信息,但更简洁.我认为这些都是好事.缺点是我们必须在incr别处定义函数.有时这不值得努力,这就是为什么lambdas被添加到语言中的原因.
这些确实是真正令人担忧的问题,并且这些问题将在下一版本的 C++ 标准(“C++0x”)中得到解决,该标准应在今年年底或 2011 年发布。该版本的 C++ 引入了一个称为C++ lambda允许人们在另一个函数中构造简单的匿名函数,这使得您可以轻松地完成您想要的任务,而无需将代码分解成小块。从 GCC 4.5 开始,GCC(实验性的?)支持 Lambda。
| 归档时间: |
|
| 查看次数: |
6492 次 |
| 最近记录: |