指针指针:std:vector vs. Array

时间:2012-11-04 16:55:11

标签: c++ arrays pointers vector

快速提问:

说的是

#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.

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

3 个答案:

答案 0 :(得分:2)

我认为你需要的是:

vector<Object*> arr;

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

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

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

答案 1 :(得分:1)

这个

之间有更多相似之处
#include <vector>

vector<Object*> arr(100);

和这个

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

为什么人们总是觉得需要新的东西?我认为因为它复杂,因此它必须是好的,对吗?实际上错了。

答案 2 :(得分:1)

实际上,您正在寻找的“并行性”介于以下两个定义之间:

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

这些是彼此“并行版本”的唯一方式是它们都提供某种指向Object的指针集或列表。从某种意义上说,它们都是Object指针的“数组”,您可以同时访问x这两个对象的成员arr[0]->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>