- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我开始使用 STL 容器是因为当我需要列表、集合和映射的功能而我的编程环境中没有其他可用的功能时,它们会派上用场。我不太关心它背后的想法。 STL 文档在涉及功能等方面很有趣。然后我跳过了阅读,只使用了容器。
但昨天,我的假期仍然很放松,我只是试了一下,想多走一点 STL 的路。所以我使用了transform函数(能不能给我一点掌声,谢谢)。
从学术的角度来看,它确实看起来很有趣并且很有效。但令我困扰的是,如果你加强对这些功能的使用,你需要成千上万的帮助类来处理你想在代码中做的大部分事情。程序的整个逻辑被切成小块。这种切片不是良好编码习惯的结果;这只是一个技术需求。有些东西,这让我的生活可能更难而不是更容易。
我从惨痛的教训中学到,你应该始终选择最简单的方法来解决手头的问题。例如,我看不出 for_each 函数为我做了什么,证明在位于正常循环内的几行简单代码上使用帮助程序类是合理的,这样每个人都可以看到正在发生的事情。
我想知道,您对我的顾虑有何看法?当您开始以这种方式工作并在习惯后改变主意时,您是否像我一样看到它?有没有我忽略的好处?还是像我一样忽略这些东西(并且可能会继续这样做)。
谢谢。
PS:我知道boost里面有一个真正的for_each循环。但我在这里忽略它,因为我猜这只是我通常使用迭代器循环的一种方便方式。
最佳答案
The whole logic of the program is sliced in tiny pieces. This slicing is not the result of good coding habits. It's just a technical need. Something, that makes my life probably harder not easier.
在某种程度上,你是对的。这就是为什么即将到来的 C++ 标准修订版将添加 lambda 表达式,允许您执行如下操作:
std::for_each(vec.begin(), vec.end(), [&](int& val){val++;})
但我也认为根据当前需要拆分代码通常是一个很好的编码习惯。您有效地将描述您想要执行的操作的代码与将它应用于一系列值的行为分开。这是一些额外的样板代码,有时很烦人,但我认为它也经常会产生好的、干净的代码。
今天执行上述操作将如下所示:
int incr(int& val) { return val+1}
// and at the call-site
std::for_each(vec.begin(), vec.end(), incr);
我们没有用一个完整的循环来膨胀调用站点,而是用一行描述:
所以它更短,传达与循环相同的信息,但更简洁。我认为这些都是好事。缺点是我们必须在别处定义 incr
函数。有时这根本不值得付出努力,这就是为什么将 lambda 添加到语言中的原因。
关于c++ - 你如何使用像 for_each 这样的 STL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2856626/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!