C ++ возможно использовать семантику перемещения для перемещения данных из одного вектора в другой - PullRequest
1 голос
/ 22 марта 2019

Код ниже копирует данные из одного вектора в другой.Если векторы большие, то я думаю, что это дорого.Можно ли здесь использовать семантику перемещения для копирования данных из одного вектора в другой?

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

Ответы [ 4 ]

5 голосов
/ 22 марта 2019

Вы можете использовать алгоритм std::move вместо std::copy:

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

Он по-прежнему будет передавать элементы по элементам, но вместо этого будет перемещать их. Не забудьте предварительно выделить вектор с правильным размером, чтобы избежать слишком большого перемещения элементов.

4 голосов
/ 22 марта 2019

Да, вы можете сделать это с std::move_iterator.

std::copy(std::make_move_iterator(oldData.begin()), 
          std::make_move_iterator(oldData.end()), 
          newData.begin());

Как сказал @ tkausl , это не имеет большого смысла для vector встроенных типов; копия в этом случае выполняется наконец. Возможно, вы захотите переместить vector напрямую, например,

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

или

newData = std::move(oldData); // move assignment
0 голосов
/ 22 марта 2019

Я предполагаю, что вы не понимаете семантику перемещения. Если вы должны сохранить свои старые данные принадлежащими старому месту, нет никакой возможности использовать семантику перемещения. Переместить семантику означает переместить данные из старого в новое.

Дополнительное время по Гринвичу 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 .

0 голосов
/ 22 марта 2019

В представленном примере перемещения или копирования нет никакой разницы, поскольку значения в векторе не выполняют никаких пространственных действий во время перемещения (это двойное число).

Вот разумный пример:

 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,Это практично, если используется с другими алгоритмами.С копировать / перемещать не очень практично.

...