Существует ли функция std для простого копирования вектора указателей на классы в вектор классов, или мне нужно вручную выполнять итерации по ним?
Ищите решение с самым быстрым / меньшим количеством строк кода :).
Решение, которое позволяет избежать копирования без утечки памяти, также приветствуется!
Я сомневаюсь, что есть такой, ниже один лайнер с для:
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>>
?
Однострочник без ручной итерации вообще:
std::for_each(vec1.begin(), vec1.end(), [&](auto x) { vec2.push_back(*x); });
(Отказ от ответственности: я не уверен на 100% в синтаксисе захвата ссылок.)
Вы должны сделать это самостоятельно. 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).