c++11 成员函数从 unique_ptr 的 vector 返回原始指针的 vector

标签 c++ c++11

我开始使用 C++11 功能,我喜欢使用智能指针来拥有对象。这是我的类(class):

class MyClass {
  public:
    vector<MyObject*> get_objs() const;

  private:
    vector<unique_ptr<MyObject>> m_objs;
};

语义是MyClass拥有一系列 MyObject通过 make_unique 创建(). get_objs()返回一个原始指针 vector ,以便各种调用者更新对象。因为那些调用者不拥有对象,所以函数不返回 vector<unique_ptr>.

但这意味着我需要实现 get_objs()像这样:

vector<MyObjects*> MyClass::get_objs() const
{
  vector<MyObjects*> ret;
  for (auto obj : my_objs) {
    ret.push_back(obj->get());
  }
  return ret;
}

我担心的是 get_objs()被相当频繁地调用,每次都有开销来构造这个原始指针 vector 。

这里有什么我可以做的吗?如果没有 c++11 技巧来节省开销,我应该只使用 vector<MyObject*> 类型吗?对于 m_objs首先?

UPDATE 1

Jonathan Wakely 的解决方案使用 operator[]改进我的,以便调用者可以直接访问单个对象。

还有其他解决办法吗?我不介意去所有的地方打电话get_objs(),但想看看是否有更好的解决方案。

另一个注意事项 - 我不能使用 BOOST,只是我不得不忍受一些限制。

最佳答案

首先,您可以使用 ret.reserve(m_objs.size()) 来预分配正确数量的元素。

或者,不要返回一个 vector 供调用者直接迭代,而是公开一个类似 vector 的接口(interface):

class MyClass {
  public:
    struct iterator;
    iterator begin();
    iterator end();
    MyObject* operator[](size_t n) { return m_objs[n].get(); }

  private:
    vector<unique_ptr<MyObject>> m_objs;
};

这允许调用者直接修改对象,而不是获取指针容器。

关于c++11 成员函数从 unique_ptr 的 vector 返回原始指针的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25506191/

相关文章:

C++primer 第 5 篇关于 func 参数

c++ - vs 用户模式调试器中的反引号是什么

c++ - 全局 protobuf 消息

c++ - Qt QLabel 使用窗口缩放图像

c++ - 如何在 QT GUI 应用程序中进行正确的线程处理?

c++ - 在构造函数参数列表中构造 boost::function 对象时出现错误 C2228

c++ - 如何切断字符串的一部分,集合中的每个字符串都有

c++ - 使用初始化列表作为参数时的歧义

c++ - 如何从析构函数调用 const 成员函数

c++ - 如何扩展这个 C++11 事件系统来处理多个参数?