繁体   English   中英

指针的指针:std:vector vs. Array

[英]Pointer of pointers: std:vector vs. Array

快速提问:

在说

#include <vector>
vector<Object*>* arr = new vector<Object*>();

并行版本/相似/等

Object** arr = new Object*[100]; //I guess any size can do since vector maximum size changes all the time.

如果我错了,有人可以纠正我吗?

我认为您需要的是:

vector<Object*> arr;

这将是指针的“数组”。 (当您离开声明数组的范围时,该数组将被自动销毁)。

当然,您可以具有vector<Object*>* ,但它更类似于

Object*** arr = new Object**;
*arr = new Object*[100];

两者之间有更多相似之处

#include <vector>

vector<Object*> arr(100);

和这个

Object** arr = new Object*[100];

人们为什么总是需要更新所有内容? 我认为是因为它很复杂,因此必须很好,对吗? 其实错了。

确实,您要寻找的“并行性”介于以下两个定义之间:

vector<Object*> arr;
Object** arr = new Object*[100];

它们彼此为“并行版本”的唯一方式是它们都提供某种指向Object的指针集或列表。 从某种意义上说,它们两者都是指向Object的指针的“数组”,并且您可以同时使用arr[0]->x这样的对象来访问Object的成员x 然而,无论是真正类型的array of pointer to Object

特别是,使您的第一个定义与第二个定义不同的是,您有一个指向vector的指针。 在这种情况下,这与访问部件x(*arr)[0]->x ,具有取消引用指针第一。

但是,这两个arr定义在很多方面彼此都非常不同,因此我永远不会认为它们是相似的。 第一种是更惯用的C ++,因为向量将为您整理指针的分配和释放。 对于第二个,您将需要记住稍后要调用delete[] vector还为您提供了一个动态大小的容器以及作为vector一部分的许多其他令人敬畏的功能。

但是,就编写干净且惯用的C ++而言,最好的选择也不是。 无论您做出哪种选择,您都仍然必须(使用new )分配要存储指针的实际Object ,然后记住要delete它们。 您最好的选择是只使用vector<Object> arr 如果由于某种原因确实需要存储指向对象的指针,那么最好使用某种智能指针,例如在vector<shared_ptr<Object>> arr 如果您的容器将具有固定的大小(如示例中大小为100的数组),则您可能更喜欢使用array<Object, 100>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM