Есть ли способ сделать глубокую копию вектора указателей? - PullRequest
2 голосов
/ 09 апреля 2019

Я пытаюсь заставить своих коллег использовать больше алгоритмов и менее явных циклов.Итак, мой коллега имеет вектор shared_ptr с и делает копию этого vector и элементов, на которые он указывает.У него есть что-то вроде этого:

dst.clear();
for (size_t i=0; i<src.size(); i++)
{
  std::shared_ptr<Type> pObject(new Type(*src[i]));
  dst.push_back(pObject);
}

Я думаю, что это можно было бы сделать лучше, используя std::copy с std::back_inserter, но я не вижу, как заставить его копироватьуказал на то, что используется в настоящее время в STL.

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

1 Ответ

6 голосов
/ 09 апреля 2019

Там std::transform():

std::transform(src.begin(), src.end(),
    std::back_inserter(dst),
    [](shared_ptr<Type> const& ptr) {
        return make_shared<Type>(*ptr);
    });

С оговоркой, что если Type является полиморфным, это, вероятно, делает неправильную вещь, и вы захотите добавить метод clone() или что-то в этом роде.

<ч />

В C ++ 20 это будет выглядеть примерно так:

dst = src | ranges::view::transform([](shared_ptr<Type> const& ptr){
                return make_shared<Type>(*ptr);
            })
          | ranges::to<std::vector>;

Который вы уже можете получить с помощью range-v3 сегодня.

...