C ++可以使用移动语义将数据从一个向量移动到另一个向量

时间:2019-03-22 15:08:15

标签: c++ c++11 vector move-semantics

下面的代码将数据从一个向量复制到另一个向量。如果向量很大,那么我猜这很昂贵。是否可以在此处使用移动语义将数据从一个向量复制到另一个向量?

std::vector<double> newData(Shape.Size(), 0);
std::vector<double> oldData = a->getData();
std::copy(oldData.begin(), oldData.end(), newData.begin());

4 个答案:

答案 0 :(得分:5)

您可以使用算法std::move代替std::copy

std::move(oldData.begin(), oldData.end(), newData.begin());

它仍然会逐个元素地传送元素,但是会移动它们。不要忘记预先为向量分配正确的大小,以免元素移动过多。

答案 1 :(得分:4)

是的,您可以使用std::move_iterator来做到这一点。

FOR %%F IN (*.mp3) DO ffmpeg -i %%F -filter:a "volume=1.5" louder/%%F

正如@tkausl所说,这对于std::copy(std::make_move_iterator(oldData.begin()), std::make_move_iterator(oldData.end()), newData.begin()); 的内置类型没有多大意义;最后在这种情况下执行复制。您可能想直接移动 vector,例如

vector

std::vector<double> newData = std::move(oldData); // move construction

答案 2 :(得分:0)

在提供的示例移动或复制中没有任何区别,因为vector的值在移动过程中不执行任何空间操作(两次操作)。

这是一个合理的例子:

 using FooPtr = std::shared_ptr<Foo>;

 constexpr size_t n = 100;
 std::vector<FooPtr> data;
 data.reserve(n);
 std::generate_n(std::back_inserter(data), n, FooFactory);

 std::vector<FooPtr> dst;
 dst.reserve(n);
 std::move(std::begin(data), std::end(data), std::back_inserter(dst));

请注意

 dst = std::move(data);

会更快,因为仅将数据缓冲区重新分配给另一个向量。

https://wandbox.org/permlink/pJnmrWYe40hLRYNE

其他答案使用make_move_iterator。如果与其他算法一起使用,这是实用的。复制/移动不是很实用。

答案 3 :(得分:-1)

我假设您对移动语义感到困惑。如果必须使旧数据属于旧位置,则无法使用移动语义。移动语义意味着将数据从旧移到新。

其他格林尼治标准时间18:50

#include <iostream>
#include <vector>

#include <cstdlib>
#include <ctime>

#include <cstdint>

int main()
{
    std::srand(std::time(nullptr));

    const int LEN_SHAPE = 1024;
    std::vector<double> a;
    int n = LEN_SHAPE;
    while (n--)
    {
        a.push_back( ((double)std::rand() / RAND_MAX) * std::numeric_limits<double>::max() );
    }

    std::vector<double> newData(a.size(), 0);
    std::vector<double> oldData( std::move( a ));
    std::copy(oldData.begin(), oldData.end(), newData.begin());

}

std :: vector oldData(std :: move(a)); 是移动语义,在此之后检查向量 a 中还剩下什么。