Копировать / перенести вектор & lt; Class * & gt; чтобы вектор & lt; Class & gt;

Существует ли функция std для простого копирования вектора указателей на классы в вектор классов, или мне нужно вручную выполнять итерации по ним?

Ищите решение с самым быстрым / меньшим количеством строк кода :).

Решение, которое позволяет избежать копирования без утечки памяти, также приветствуется!

1

Решение

Я сомневаюсь, что есть такой, ниже один лайнер с для:

  std::vector<X*> vec1 = { new X, new X };
std::vector<X> vec2;
vec2.reserve(vec1.size());
for (auto p : vec1) vec2.push_back(*p);

если вы хотите убедиться, что копии не сделаны, вы можете использовать std :: reference_wrapper<>:

std::vector<std::reference_wrapper<X>> vec2;
for (auto p : vec1) vec2.push_back(*p);

но затем вы должны убедиться, что ни один элемент vec2 не доступен после освобождения элементов vec1.

Другой подход заключается в использовании unique_ptr следующим образом:

std::vector<std::unique_ptr<X>> vec2;
for (auto p : vec1) vec2.emplace_back(p);

теперь вы можете отказаться от vec1, но почему бы не сделать vec1 типа std::vector<std::unique_ptr<X>>?

6

Другие решения

Однострочник без ручной итерации вообще:

std::for_each(vec1.begin(), vec1.end(), [&](auto x) { vec2.push_back(*x); });

(Отказ от ответственности: я не уверен на 100% в синтаксисе захвата ссылок.)

2

Вы должны сделать это самостоятельно. std:transform или же std::for_each поможет вам:

#include <algorithm>
#include <vector>
#include <functional>
using namespace std::placeholders;

class Myclass{};
Myclass deref(const Myclass *mc) { return *mc;}

void append(std::vector<Myclass> &v, Myclass *mc) {v.push_back(*mc);}

int main(){
std::vector<Myclass*> foo;
std::vector<Myclass> bar;
/* foo is initialised somehow */
/* bar is initialised somehow to hold the same amount of dummy elements */

//solution with transform
std::transform (foo.begin(), foo.end(), bar.begin(), deref);

bar={};
// solution with for_each
auto bound_append = std::bind(append, bar, _1);
std::for_each(foo.begin(), foo.end(), bound_append);
}

Скомпилируйте остроумие -std=c++11 (GCC).

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector