gpt4 book ai didi

c++11 - C++11 是否允许更好的方法在没有非匿名帮助函数的情况下对相似数据重复相同的操作?

转载 作者:行者123 更新时间:2023-12-01 23:10:02 24 4
gpt4 key购买 nike

(实在想不出更好的标题了,可以的话请帮忙)

这种重复的代码并不罕见……一个故意简单的例子:

vector<int> x,y,z;
vector<string> a,b,c;

for(auto i : x)
if(test(i))
a.push_back(func(i));
for(auto i : y)
if(test(i))
b.push_back(func(i));
for(auto i : z)
if(test(i))
c.push_back(func(i));

你当然可以写一个函数 Convert(const vector<int> &in, vector<string> &out)但是我很好奇是否有一种方法可以使用匿名构造或函数局部定义来避免这种情况。

类似:

vector<int> x,y,z;
vector<string> a,b,c;

for(auto o : {{x,a},{y,b},{z,c}})
...

什么是做到这一点的最巧妙的方法 - C++11 提供了超越“经典”C++/STL 方法的任何额外帮助?

注意:这个问题的重点是如何避免重复代码,而不是如何具体地在向量之间转换数据——这只是一个简单的例子。

最佳答案

经典的 STL 方法是使用 std::transform,如果你愿意,可以将其包装在 lambda 中

auto map = [](const vector<int>& in, vector<string>& out, string (*f)(int)) {
out.reserve(in.size());
std::transform(in.begin(), in.end(), std::back_inserter(out), f);
};

vector<int> x,y,z;
vector<string> a,b,c;

map(x, a, func);
map(y, b, func);
map(z, c, func);

在 C++14 中,lambda 更容易编写:

auto map = [](const auto& in, auto& out, auto f) {
out.reserve(in.size());
std::transform(in.begin(), in.end(), std::back_inserter(out), f);
};

要在编辑的问题中做不同的操作,只需改变 lambda 的主体,你仍然避免重复逻辑,所以你只定义一次,然后将它应用到每对向量:

auto op = [](const auto& in, auto& out, auto f) {
for (auto i : in)
if (test(i))
out.push_back(f(i));
};

op(x, a, func);
op(y, b, func);
op(z, c, func);

如果您想在 C++14 中走极端,您可以将向量捆绑在元组中,然后使用 Library Fundamentals TS 中的 apply,如下所示:

vector<int> x,y,z;
vector<string> a,b,c;

using std::experimental::apply;

auto mapper = [&func, &test](auto... t) {
auto op = [](const auto& in, auto& out) {
for (auto i : in)
if (test(i))
out.push_back(func(i));
};
std::tie( (apply(op, t), std::ignore) ... );
};
mapper( std::tie(x, a), std::tie(y, b), std::tie(z, c) );

但这越来越难以理解了!

关于c++11 - C++11 是否允许更好的方法在没有非匿名帮助函数的情况下对相似数据重复相同的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33669128/

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