gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:51:13 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com