我开始使用 c++11 功能,并且我喜欢仅使用智能指针来拥有对象。这是我的课程:
class MyClass {
public:
vector<MyObject*> get_objs() const;
private:
vector<unique_ptr<MyObject>> m_objs;
};
语义是MyClass
拥有一系列MyObject
是通过创建的make_unique
(). get_objs()
返回原始指针向量,以便各个调用者更新对象。因为那些调用者不拥有该对象,所以该函数不会返回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()
被调用得相当频繁,每次构造这个原始指针向量都会产生开销。
我在这里可以做点什么吗?如果没有 c++11 技巧来节省开销,我应该只使用 typevector<MyObject*>
for m_objs
首先?
UPDATE 1
Jonathan Wakely 的解决方案使用operator[]
改进了我的,以便调用者可以直接访问单个对象。
还有其他解决办法吗?我不介意去所有打电话的地方get_objs(),
但想看看是否有更好的解决方案。
另一个注意事项 - 我不能使用 BOOST,只是我必须忍受一些限制。
首先,您可以使用ret.reserve(m_objs.size())
预先分配正确数量的元素。
或者,不要返回一个向量供调用者直接迭代,而是公开一个类似向量的接口:
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;
};
这允许调用者直接修改对象,而不是获取指针容器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)