gpt4 book ai didi

c++ - For循环与使用相对较旧的编译器的标准库算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:53 33 4
gpt4 key购买 nike

我知道没有任何混淆的代码会更好 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环形?

最佳答案

至少在我看来,这里的主要问题是 transform完全是错误的工作工具。

你想做的正是std::replace_copy_if确实如此(这并不奇怪)它做得更巧妙。

我手头的机器上没有安装Qt,所以我冒昧地更换了你的QVariantQString代码为 std::vector<std::string> ,但我相信同样的基本思想也应该适用于 Qt 类型。

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <string>

int main() {
std::vector<std::string> input { "one", "two", "", "three" };
std::vector<std::string> output;

// copy input to output, replacing the appropriate strings:
std::replace_copy_if(input.begin(), input.end(),
std::back_inserter(output),
[](std::string const &s) { return s.empty(); },
"NONE");

// and display output to show the results:
std::copy(output.begin(), output.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}

目前,这只是将空字符串替换为 NONE , 但添加 null 检查应该非常简单(当然,对于 isNull 有意义的类型)。

根据上面的数据,我得到了您可能期望的结果:

one
two
NONE
three

不过,我可能应该补充一点,即使这样显然也很冗长。当我们至少将范围添加到标准库时会很好,所以(例如)input.begin(), input.end()可以只替换为 input .结果可能仍然不会像您提供的 D 代码那样简洁,但至少它在一定程度上减少了冗长(这同样适用于大多数其他算法)。

如果你关心这个,有几个 range您可能想要查看的库-- Boost Range一方面,(在我看来更有趣)Eric Neibler's range library .

关于c++ - For循环与使用相对较旧的编译器的标准库算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30635152/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com