将vector <class *>复制/包装到vector <class>

时间:2015-11-24 15:32:44

标签: c++ loops pointers vector std

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

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

一个避免复制而不会泄漏内存的解决方案也受到欢迎!

3 个答案:

答案 0 :(得分:6)

我怀疑是否有这样的,下面是一个用于:

的班轮
  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&lt;&gt;:

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?

答案 1 :(得分:2)

你必须自己做。 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)。

答案 2 :(得分:2)

根本没有手动迭代的单行:

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

(免责声明:我对参考捕获lambda语法不是100%肯定。)