如何简化此代码?

时间:2015-01-14 13:33:43

标签: 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));
}
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;

一次是一个不带参数的函数并返回一个double,例如,在[0,1]中返回一个随机数。平均16个结果。如果我平均100次,我发现代码真的是多余的。使用循环可能解决问题,但我不确定并发是否仍然有效,所以我徘徊如何简化代码?

2 个答案:

答案 0 :(得分:10)

了解C++ algorithms

using type = unique_ptr<future<double>>;
auto mean = std::accumulate(results.begin(), results.end(), 0.0,
        [](double a, type const& b) { return a + b->get(); }) / results.length();

答案 1 :(得分:1)

康拉德鲁道夫指出,

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();

适用于vector

中的任意数量的元素