在Stanley Lippman的书中有一个例子,当他使用
时vector <string> * var;
他为什么要创建一个指向vector的指针?
有时创建指向vector的指针是否有用? 我应该什么时候这样做?
答案 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);
或者我可以通过为呼叫创建一个临时指针来声明pv
:frobnicate("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为其元素分配内存,并在堆上分配(已分配的内存)地址。
这就是“为什么要使用向量指针?”的原因之一。 如果我弄错了,请告诉我。
谢谢