只是想知道你认为关于C ++中矢量的最佳实践。
如果我有一个包含vector成员变量的类。 该向量何时应声明为:
vector<MyClass> my_vector;
vector<MyClass>* my_vector;
vector<MyClass*> my_vector;
vector<MyClass*>* my_vector;
我在我的一个类中有一个特定的例子,我当前已将一个向量声明为案例4,即vector<AnotherClass*>* my_vector;
其中AnotherClass是我创建的另一个类。
然后,在我的构造函数的初始化列表中,我使用new:
创建向量MyClass::MyClass()
: my_vector(new vector<AnotherClass*>())
{}
在我的析构函数中,我执行以下操作:
MyClass::~MyClass()
{
for (int i=my_vector->size(); i>0; i--)
{
delete my_vector->at(i-1);
}
delete my_vector;
}
向量的元素添加到我班级的一个方法中。 我不知道有多少物体会提前添加到我的矢量中。这是在代码执行时决定的,基于解析xml文件。
这是好习惯吗?或者是否应该将向量声明为其他情况1,2或3之一?
何时使用哪种情况?
我知道如果向量的元素是另一个类的子类(多态),则它们应该是指针。但是在任何其他情况下都应该使用指针吗?
非常感谢!!
答案 0 :(得分:4)
通常解决方案1是您想要的,因为它是C ++中最简单的:您不必管理内存,C ++会为您完成所有这些(例如,您不需要提供任何析构函数)
在某些特定情况下,这不起作用(最明显的是在使用多态对象时),但一般来说这是唯一的好方法。
即使在使用多态对象或需要堆分配的对象时(无论出于何种原因),原始指针几乎都不是好主意。相反,使用智能指针或智能指针容器。现代C ++编译器提供了即将推出的C ++标准中的shared_ptr
。如果您使用的编译器还没有,那么您可以使用implementation from Boost。
答案 1 :(得分:1)
绝对是第一个!
您使用vector进行自动内存管理。使用指向向量的原始指针意味着您不再进行自动内存管理,这是没有意义的。
对于值类型:所有容器基本上都假设类似于语义的语义。同样,在使用指针时你必须进行内存管理,而向量的目的就是为你做这件事。这也在书籍C++ Coding Standards的第79项中有所描述。如果您需要使用共享所有权或“弱”链接,请改用相应的智能指针。
答案 2 :(得分:0)
手动删除向量中的所有元素是一种反模式,违反了C ++中的RAII习惯用法。因此,如果必须存储指向vector
中对象的指针,最好使用“智能指针”(例如boost::shared_ptr
)来促进资源破坏。例如,boost::shared_ptr
在销毁对象的最后一个引用时自动调用delete
。
也无需使用MyClass::my_vector
分配new
。一个简单的解决方案是:
class MyClass {
std::vector<whatever> m_vector;
};
假设whatever
是智能指针类型,没有额外的工作要做。就是这样,当MyClass
实例的生命周期结束时,所有资源都会自动销毁。
在许多情况下,你甚至可以使用普通的std::vector<MyClass>
- 当向量中的对象可以安全复制时。
答案 3 :(得分:0)
在您的示例中,向量是在创建对象时创建的,并且在对象被销毁时会被销毁。这正是使vector
成为类的普通成员时所获得的行为。
此外,在您当前的方法中,在复制对象时会遇到问题。默认情况下,指针会产生平面副本,这意味着对象的所有副本将共享相同的向量。这就是为什么,如果您手动管理资源,通常需要The Big Three。
指针向量在多态对象的情况下很有用,但是你应该考虑其他选择:
boost::ptr_vector
。boost::shared_ptr
的矢量或boost::ref
的矢量。答案 4 :(得分:-1)
指向vector
的指针很少有用 - vector
构造和销毁成本低廉。
对于vector
中的元素,没有正确的答案。 vector
多久更改一次?复制构造vector
中的元素需要多少钱?其他容器是否有vector
元素的引用或指针?
根据经验,在看或测量之前,我没有任何指示,因为复制类很昂贵。当然,您提到的在vector
中存储基类的各种子类的情况下,需要指针。
如果您的设计要求您将指针用作boost::shared_ptr
元素,那么像vector
这样的引用计数智能指针可能是最佳选择。
答案 5 :(得分:-1)
复杂的答案:这取决于。
如果你的向量是共享的,或者它的生命周期与嵌入它的类不同,那么将它作为指针保留可能会更好。 如果您引用的对象没有(或者有昂贵的)复制构造函数,那么最好保留指针向量。相反,如果你的对象使用浅拷贝,使用对象向量可以防止你泄漏......
答案 6 :(得分:-1)
这取决于。无论是选择声明1还是3, 认为如何声明该类型的单个对象 。在决定是使用数字1还是2时,数字1通常是正确的选择,因为矢量是一个非固定大小的容器,所以你不需要改变它在运行时。