Объектобезопасный элемент перемещения от конца вектора к концу другого вектора - PullRequest
0 голосов
/ 17 февраля 2020

Я очень новичок в C ++.

Я исследовал множество статей о C ++ и решениях для перемещения последнего элемента вектора в другой, но я до сих пор не понимаю, как это сделать.

У меня есть два вектора:

std::vector<Person *> persons;
std::vector<Person *> availablePersons;

и функция:

MoveLast() {
    std::move(persons.end() - 1, persons.end(), std::back_inserter(availablePersons));
}

Но это выглядит очень долго и работает не так, как ожидалось.

Так что мне нужно простой и эффективный метод без потери Person объектов в памяти

1 Ответ

1 голос
/ 17 февраля 2020

Векторы не содержат Person объектов, они просто содержат указатели. Перемещение этих указателей действительно означает выполнение копии. Итак, вы делаете две вещи: копируете указатель на один контейнер и удаляете указатель из другого контейнера. Простая реализация, подобная этой, должна быть всем, что вам нужно:

MoveLast() {
    if (!persons.empty()) { // ensure source vector isn't empty
        availablePersons.push_back(persons.back()); // copy last element to destination
        persons.pop_back(); // remove last element from source
    }
}

Если ваши векторы содержали тип, для которого было разрешено перемещение, то в качестве оптимизации вы можете изменить вторую строку следующим образом:

availablePersons.push_back(std::move(persons.back())); // move last element to destination
...