【问题标题】:Is it a good idea to use pointer to stl vector?使用指向 stl 向量的指针是个好主意吗?
【发布时间】:2014-12-15 21:22:06
【问题描述】:

在 Stanley Lippman 的书中有一个例子,当他使用

vector <string> * var;

他为什么要创建一个指向向量的指针?

有时创建一个指向向量的指针有用吗? 我应该什么时候这样做?

【问题讨论】:

  • 它就像指向其他任何东西的指针一样有用。
  • 但是vector的数据已经在堆里了。在我看来,指向向量的指针只会增加删除问题。那么指针有什么用呢?
  • 可能,除非你提供了一个花哨的分配器。即使这样,您也可能希望将向量作为指针传递,动态分配它等(尽管在现代 C++ 中,原始指针可能被称为稀有指针,诚然)。哦,现代 C++ 允许指定移动语义,通常不再需要将向量作为指针或引用传递。

标签: c++ pointers stl


【解决方案1】:

指针不仅对堆上的数据有用,并不是所有的指针都应该被删除。

指针可用作对另一个对象的可能为空的引用,例如,您可能需要调用具有指针参数的函数,表明您可以选择传递向量:

int frobnicate(std::string filename, std::vector<std::string>* words);

如果我传递一个非空指针作为第二个参数,该函数将在*words 中存储一些数据。

我可以这样称呼:

int frob = frobnicate("input.txt", nullptr);

或者像这样:

std::vector<string> v;
std::vector<string>* pv = &v;
int frob = frobnicate("input.txt", pv);

或者我可以通过为调用创建一个临时指针来避免声明pvfrobnicate("input.txt", &amp;v),但我没有这样做。

【讨论】:

    【解决方案2】:

    是的,确实很有用。

    更有用的是unique_ptr&lt;vector&lt;string&gt;&gt; var ( new vector&lt;string&gt;)

    【讨论】:

    • 如果你用make_unique()就更好了。
    【解决方案3】:

    正确的思考方式是,vector对象的生命周期。

    例如:

    {
       vector<string> mstrs;
    }
    

    对象“mstrs”超出范围,容器中的值无法进一步使用。

    您可以将此分析扩展到填充此向量的函数。您是否要按值返回,从而在调用站点产生对象的复制成本或传递引用。

    指向向量,为您提供有关生命周期管理的选择,与范围规则无关。您可能仍然希望通过使用智能指针等来利用范围界定。这本身就是一个单独的主题。

    正如你所提到的,指针肯定会增加内存管理——这意味着你必须在适当的时候正确地删除对象。

    【讨论】:

      【解决方案4】:

      两种类型的向量声明及其含义: 1) std::vector 变量; - 对于此声明,Vector 为其在堆上的元素分配内存,并在堆栈上为其(分配的内存)地址。 - 因此元素的数量与堆栈大小成正比(而且大的堆栈大小不利于编程,基本上不适合小型设备编程)。 2) std::vector *var = new vector(); - 对于这个声明,Vector 为其元素分配内存,并且它的(分配的内存)地址都在堆上。

      这就是“为什么要使用向量指针?”的原因之一。 如果我弄错了,请告诉我。

      谢谢

      【讨论】:

        猜你喜欢
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 2017-08-26
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 1970-01-01
        相关资源
        最近更新 更多