使用指向stl向量的指针是个好主意吗?

时间:2014-12-15 21:22:06

标签: c++ pointers stl

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

vector <string> * var;

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

有时创建指向vector的指针是否有用? 我应该什么时候这样做?

4 个答案:

答案 0 :(得分:2)

指针不仅对堆上的数据有用,而且不应删除所有指针。

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

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", &v)但我 没有这样做。

答案 1 :(得分:0)

是的确有用。

更有用的将是这个unique_ptr<vector<string>> var ( new vector<string>)

答案 2 :(得分:0)

思考的正确方法是,向量的生命周期&lt;&gt;对象

例如:

{
   vector<string> mstrs;
}

对象'mstrs'超出了范围,容器中的值无法继续使用。

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

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

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

答案 3 :(得分:0)

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

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

谢谢