【问题标题】:Pointer of pointers: std:vector vs. Array指针指针:std:vector vs. Array
【发布时间】:2012-11-04 16:55:11
【问题描述】:

快速提问:

在说

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

?

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

【问题讨论】:

  • 第一个是指向“数组”的指针,如果你愿意的话,指针。第二个是指针的“数组”。
  • @chris 所以我想,这意味着我的怀疑是对的?
  • 嗯,第一个是指向 X 的指针,第二个是 X,其中 X 不完全相等,但可以表示相同的东西。第一个指向的那个额外的指针将它区分开来。
  • @raina77ow 问题是关于向量是否是指针的指针,就像第二个例子一样。
  • 向量是指针中的一个指针,但是您在向量示例中添加了一个额外的不必要的指针。

标签: c++ arrays pointers vector


【解决方案1】:

我认为你需要的是:

vector<Object*> arr;

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

当然,你可以vector&lt;Object*&gt;*,但它更类似于

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

【讨论】:

    【解决方案2】:

    这之间有更多的相似之处

    #include <vector>
    
    vector<Object*> arr(100);
    

    还有这个

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

    为什么人们总是觉得有必要更新一切?我认为因为它很复杂,所以它一定很好,对吧?其实错了。

    【讨论】:

    • 我认为“need to new”来自 Java,您在 Java 中为您创建的每个对象调用 new。
    【解决方案3】:

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

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

    它们是彼此“并行版本”的唯一方式是它们都提供某种指向Object 的指针集或列表。从某种意义上说,它们都是指向Object 的指针的“数组”,您可以同时访问arr[0]-&gt;x 等对象的成员x。然而,array of pointer to Object 类型真正也不是。

    特别是,使您的第一个定义与第二个定义不同的是您有一个指向vector 的指针。在这种情况下,您将像 (*arr)[0]-&gt;x 一样访问成员 x,而必须先取消引用指针。

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 1970-01-01
      • 2018-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 2021-09-09
      相关资源
      最近更新 更多