【问题标题】:How to initialise a vector of pointers based on the vector of objects in c++ in the most elegant way?如何以最优雅的方式根据 C++ 中的对象向量初始化指针向量?
【发布时间】:2016-11-03 12:32:17
【问题描述】:

如果有一个对象向量,例如:

vector <Obj> a;

创建指向向量 a 中对象的指针向量的最佳方法是什么?:

vector <Obj*> b;

【问题讨论】:

  • 哪个版本的 C++ ? C++11, C++14, C++~17 ?为什么不是智能指针向量?
  • 从C++11开始你可以使用list initialization(即:vector b { new Obj(), obj_ptr, ... })
  • 这样做要小心。如果a 必须分配新的存储空间,你最终会得到一个充满悬空指针的向量。
  • @krzaq 的回答很好,但我想在这里指出这是一个脆弱的情况。 b 中的指针几乎可以通过对a 的任何插入或删除操作而失效。

标签: c++ vector stl initialization


【解决方案1】:

只需使用std::transform

// if b is empty (this will append to the end of b)
b.reserve(a.size()); // optional, but a good habit
std::transform(a.begin(), a.end(), std::back_inserter(b), [](Obj& o){ return &o; });

​ 或者

b.resize(a.size());
std::transform(a.begin(), a.end(), b.begin(), [](Obj& o){ return &o; });

或者,您可以使用boost::transform_iterator 直接初始化b

auto tr = [](Obj& o){ return &o; };
std::vector<Obj*> b(
    boost::make_transform_iterator(a.begin(), tr),
    boost::make_transform_iterator(a.end(), tr)
);

【讨论】:

  • 可能值得补充的是,b 在此调用之前应该为空。如果 OP 认为他们必须首先是 b.resize()
  • 好吧reserve 不会受到伤害,调整大小可能会做一些 OP 不想做的事情。 ..
  • @AaronMcDaid 我不确定你是如何推断出 op 想要 resize,但已编辑 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多