Перемещение unique_ptrs из одного вектора в другой - PullRequest
15 голосов
/ 26 апреля 2011

Я бы хотел переместить unique_ptr, сохраненный в несортированном из них, в другой вектор, который будет содержать отсортированный вектор указателей.

Конечно, перемещение unique_ptr не приведет к автоматическому удалению элемента в первом векторе? Как я могу это сделать?

Пример того, что я хочу сделать:

std::vector<std::unique_ptr<T> > unsorted, sorted;
// fill the "unsorted" vector
while( unsorted.size() > 0 )
{
    const auto it = find_next_element_to_add_to_sorted(unsorted);
    sorted.push_back( std::move(*it) );
}

Надеюсь, цель ясна.

ОБНОВЛЕНИЕ : Мой алгоритм не позволяет выполнять сортировку на месте. Если кто-то чувствует себя хорошо сегодня (я не спрашиваю, см. Выше для моего вопроса), не стесняйтесь применить это для этой ситуации и покажите мне. Мне действительно нужно "сортировать по ходу". И я действительно не понимаю, почему переезд был бы , что намного дороже.

1 Ответ

16 голосов
/ 26 апреля 2011

Ваш код выглядит для меня в основном корректным, за исключением того, что он кажется таким, как вы намереваетесь стереть перемещенный из unique_ptr из несортированного вектора:

std::vector<std::unique_ptr<T> > unsorted, sorted;
// fill the "unsorted" vector
while( unsorted.size() > 0 )
{
    const auto it = find_next_element_to_add_to_sorted(unsorted);
    sorted.push_back( std::move(*it) );
    unsorted.erase(it);
}

После хода it относится к перемещенным из unique_ptr и *it == nullptr. Он все еще существует в unsorted и, если это нежелательно, должен быть явно удален.

...