Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何简化此代码?;_C++_Templates_C++11_Concurrency - Fatal编程技术网

C++ 如何简化此代码?;

C++ 如何简化此代码?;,c++,templates,c++11,concurrency,C++,Templates,C++11,Concurrency,我在程序中测试并发性,并编写以下代码 vector<unique_ptr<future<double>>> results; for (unsigned i = 0; i != 16; ++i) { unique_ptr <future<double>> result(new future<double >{ async(once) }); results.push_back(move(result));

我在程序中测试并发性,并编写以下代码

vector<unique_ptr<future<double>>> results;
for (unsigned i = 0; i != 16; ++i)
{
     unique_ptr <future<double>> result(new future<double >{ async(once) });
     results.push_back(move(result));
}
auto ave = (results[0]->get() + results[1]->get() + results[2]->get() +\
    results[3]->get() + results[4]->get() + results[5]->get() +\
    results[6]->get() + results[7]->get() + results[8]->get() + \
    results[9]->get() + results[10]->get() + results[11]->get() + \
    results[12]->get() + results[13]->get() + results[14]->get() + \
    results[15]->get()) / 16.0;
矢量结果;
for(无符号i=0;i!=16;++i)
{
唯一的_ptr结果(新的未来{async(once)});
结果。推回(移动(结果));
}
自动ave=(结果[0]->get()+结果[1]->get()+结果[2]->get()+\
结果[3]->get()+结果[4]->get()+结果[5]->get()+\
结果[6]->get()+结果[7]->get()+结果[8]->get()+\
结果[9]->get()+结果[10]->get()+结果[11]->get()+\
结果[12]->get()+结果[13]->get()+结果[14]->get()+\
结果[15]>get())/16.0;
once是一个函数,它不接受任何参数并返回一个double,例如,返回[0,1]中的一个随机数。平均值是16个结果的平均值。我发现代码真的是多余的,如果我平均100次会怎么样。使用循环也许可以解决这个问题,但我不确定并发性是否仍然有效,所以我想知道如何简化代码

学习:

使用type=unique\u ptr;
自动平均值=标准::累加(results.begin()、results.end()、0.0、,
[](双a,键入const&b){返回a+b->get();})/results.length();

正如康拉德·鲁道夫指出的那样,C++算法是一条出路。如果出于任何原因无法使用算法,那么这个答案只是一个扩展。如果没有算法,您可以使用另一个for循环。这段可怕的代码

auto ave = (results[0]->get()  + results[1]->get()  + results[2]->get()  +
            results[3]->get()  + results[4]->get()  + results[5]->get()  +
            results[6]->get()  + results[7]->get()  + results[8]->get()  +
            results[9]->get()  + results[10]->get() + results[11]->get() +
            results[12]->get() + results[13]->get() + results[14]->get() +
            results[15]->get()) / 16.0;
可以用

auto it = results.begin();
auto ave = (*(it++))->get(); // so you can still use auto
for(/* it already initialized */; it != results.end(); ++it)
    ave += (*it)->get();
ave /= results.size();

这将适用于
向量中的任意数量的元素

行尾无需反斜杠。如果您需要代码复查,。是否有任何理由动态分配
std::future
s?您可以使用
向量结果
结果。向后推(异步(一次))
唯一性\u ptr
。我知道不能复制
未来类型
,但是向量中的元素应该是
可复制的
。因此,我使用
unique\u ptr
而不是元素本身。我真的很困惑为什么你的代码可以工作?(根据我急于发布错误答案,显然我也应该学习C++算法,在这里发布之前……我现在已经纠正了)@ @ UmNyobe实际上是这样做的,默认操作为<代码> STD::Stult是<代码> STD::+ < /COD>,即求和。然而,这显然不是专门针对
unique\u ptr
元素的(可以想象,这是专门针对这一点的)。我知道循环可以完成这项工作。在表达式“auto accum=results[0]->get()+results[1]->get()”中,results[0]->get()和results[1]->get()同时运行。但是,如果以循环方式计算累积和,我不知道并发是否仍在工作?如何使它们并发运行?如果希望reduce操作(元素总和)并发运行,则需要将问题分解为逻辑部分。例如,您可以同时添加两个相邻值,将16个值减少为8个值,然后重复此步骤,直到只剩下一个值。要实现并发性,可以使用线程或SSE指令。
auto it = results.begin();
auto ave = (*(it++))->get(); // so you can still use auto
for(/* it already initialized */; it != results.end(); ++it)
    ave += (*it)->get();
ave /= results.size();