复制/包装向量<类*>到向量<Class>

Copy/wrap vector<Class*> to vector<Class>

本文关键字:gt lt 向量 Class 复制 包装      更新时间:2023-10-16

是否有一个std函数可以轻松地将指向类的指针向量复制到类向量中,或者我必须手动迭代它们?

寻找具有最快/更少代码行的解决方案:)。

还欢迎一种避免复制而不泄漏内存的解决方案!

我怀疑是否存在,下面是一个带有for的行:

  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);

但是,您必须确保在释放vec1元素之后,不会访问vec2的任何元素。

另一种方法是使用unique_ptr,如下所示:

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

现在你可以抛弃vec1,但为什么不制作std::vector<std::unique_ptr<X>>类型的vec1呢?

一个完全没有手动迭代的单行:

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

(免责声明:我不能100%确定引用捕获lambda语法。)

你必须自己做。std:transformstd::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)编译。