【发布时间】:2015-06-04 04:48:54
【问题描述】:
我知道当代码中没有任何令人困惑的 for 循环时,代码会更好。尽可能重用标准库算法总是好的。但是,我发现迭代器和算法的语法看起来真的很混乱。
我想举一个我当前项目中的真实例子:我想将vector<vector<QString>> in的内容复制到vector<QVariant> out。我看不出两者之间的区别:
for (int i = 0; i < in[0].size(); i++ )
{
if(in[0][i].isNull() || in[0][i].isEmpty() )
out[i] = "NONE";
else
out[i] = in[0][i];
}
还有:
std::transform(in[0].begin(), in[0].end(), out.begin(), [](const QString& a)->QVariant{
if(a.isNull() || a.isEmpty() )
return "NONE";
else
return a;
});
由于我们有 Visual Studio 2012,我什至必须输入我的 lambda 的返回值。使用范围后:
in[0].map!( a => a.isNull() || a.isEmpty() ? "NONE" : a ).copy(out);
在 D 语言中,我无法忍受上面的 std::transform 代码。而且我什至不确定它是否比基本的for 循环更好。我的问题是:上面使用std::transform 的代码是否比for 循环更好?
【问题讨论】:
-
VS2012 已经实现了 lambda 表达式中返回类型的类型推导。您不必指定它。但杰里·科芬的答案更好。