下面的代码将数据从一个向量复制到另一个向量。如果向量很大,那么我猜这很昂贵。是否可以在此处使用移动语义将数据从一个向量复制到另一个向量?
std::vector<double> newData(Shape.Size(), 0);
std::vector<double> oldData = a->getData();
std::copy(oldData.begin(), oldData.end(), newData.begin());
答案 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 中还剩下什么。