将并发向量转换为 std::vector

Mik*_*eMB 6 c++ concurrency c++11 ppl visual-studio-2013

我正在寻找将 aconcurrent_vector从 PPL 库转换为普通 std::vector 的推荐方法。

我有一个函数,它在 a 中返回其结果,std::vector但内部可能使用也可能不使用并行算法。目前我正在使用insert将元素从并发向量复制到法线向量:

#ifdef PARALLEL
    std::vector<Foo> Bar() {
        concurrency::concurrent_vector<Foo> cv;

        //Fill cv in a parallel algorithm

        std::vector<Foo> sv;
        sv.insert(sv.begin(), cv.begin(), cv.end());
        return sv;
    }
#else
    std::vector<Foo> Bar() {
        std::vector<Foo> sv;

        //Fill sv in a sequential algorithm

        return sv;
    }
#endif
Run Code Online (Sandbox Code Playgroud)

虽然插入操作的性能目前还不是一个真正的问题(与函数体相比),但它似乎没有必要,我想知道是否有更好的解决方案(顺便说一句:Foo是一个不能移动的简单 POD)。

理想情况下我想要有类似的东西

std::vector<Foo> Bar() {
    concurrency::concurrent_vector<Foo> cv;

    //Fill cv in a parallel algorithm

    return static_cast<std::vector<Foo>>(cv);
}
Run Code Online (Sandbox Code Playgroud)

或者至少

std::vector<Foo> Bar() {
    concurrency::concurrent_vector<Foo> cv;

    //Fill cv in a parallel algorithm

    std::vector<Foo> sv(std::move(cv));
    return sv;
}
Run Code Online (Sandbox Code Playgroud)

关于如何正确执行此操作有什么建议吗?


编辑:
一如既往,我忽略了最明显的简化(克里斯建议):

std::vector<Foo> Bar() {
    concurrency::concurrent_vector<Foo> cv;

    //Fill cv in a parallel algorithm

    return std::vector<Foo>(cv.begin(), cv.end());
}
Run Code Online (Sandbox Code Playgroud)

虽然它(很可能)没有删除副本,但它看起来更干净。

编辑2:

这导致我提出一个问题 - 假设没有办法显式阻止向量数据的副本 - 编译器有多大可能优化副本(从并发到 std::vector),同时仍然应用RVO或对函数返回值的移动操作

Ale*_*nov 4

假设没有办法显式阻止向量数据的复制 - 编译器有多大可能优化复制(从并发到 std::vector),同时仍然在函数的返回上应用 RVO 或移动操作价值?

concurrent_vector与完全不同std::vector特别是,它的数据存储在内存中并不std::vector需要连续。因此,无论是显式转换还是作为编译器优化,您寻求的转换都是不可能的;数据需要从一个位置复制到另一个位置。