Copy/wrap 向量<Class*> 到向量<Class>

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

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

使用 fastest/fewer 行代码寻找解决方案 :)。

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

我怀疑是否存在这样的,下面是一个带有 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: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) 编译。

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

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

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