这是在类中使用动态数组C++最好方法

which is the best way to use dynamic array in C++ class?

本文关键字:C++ 数组 方法 动态      更新时间:2023-10-16

C++更新,请不要取消投票...

我有班级组和人,组有很多人。有很多方法可以实现这一点。以下 3 种方式很常见。

// 1. using dynamic pointer. 
class Group {
    Person *persons;
    int size;
public:
    Group(Person *ps, int sz);
};
// 2. using STL container. 
class Group {
    vector<Person> persons;
    int size;
public:
    Group(vector<Person> ps, int sz);
};
// 3. also STL container, but using pointer. 
class Group {
    vector<Person> *persons;
    int size;
public:
    Group(vector<Person> *ps, int sz);
};

我想知道哪一种是最好的方法?后两种方式有什么区别吗?如果使用指针,则可能会出现内存泄漏。如果使用参考,我们不需要考虑泄漏问题,不是吗?

除非您一直按值复制组并且性能至关重要,否则第二种方法可能是最好的。您将获得动态大小矢量,并且您不关心释放内存(矢量按值存储)。同样在第二和第三变体中,您不需要存储大小,因为 vector 已经有这些数据。

假设Group拥有Person的所有权,并且您希望避免复制向量,则可以移动资源。

class Group {
    std::vector<Person> persons;
public:
    Group(std::vector<Person>&& ps) : persons(std::move(ps)) {}
};
直接从

Group添加Person而不公开内部内容可能会更干净:

class Group {
    std::vector<Person> persons;
public:
#if 1
    // generic method,
    template <typename ... Args>
    Person& AddPerson(Args&&... args) {
         persons.emplace_back(std::forward<Args>(args)...);
         return persons.back();
    }
#else
    // but it would be simpler to just use directly
    // the arguments of Person's constructor
    Person& AddPerson(const std::string& name) {
         persons.emplace_back(name);
         return persons.back();
    }
#endif
};

使用动态数组编程,首选选项是 std::vector(选项 2)。