我开始使用 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/