C++中的指针和向量

Posted

技术标签:

【中文标题】C++中的指针和向量【英文标题】:Pointer and vectors in C++ 【发布时间】:2012-02-09 18:30:24 【问题描述】:

我从 C++ 开始,我有一个疑问:

我正在创建一个函数,它将返回类 MyClass 的对象向量。

vector<MyClass>* myMethod()

第一个问题,返回指针对吗?

第二个问题是:如果我要返回一个指针,我是否也应该将 MyClass 对象的指针插入到向量中?

MyClass* object;
myVector.push_back(*object);

【问题讨论】:

I'm making a function which will return a vector of objects of a class MyClass 不,你不是。你正在返回一个指针。 it's correct to return a pointer? 这取决于很多很多事情。 您的代码示例 (a) 使用了无效指针和无效指针的无效解引用; (b) 没有意义,因为您根本没有将指针插入向量中 【参考方案1】:

向量可以是对象向量或指针向量。这与您是否拥有向量或指向该向量的指针完全无关。

如果您刚开始使用 C++,请尽量避免使用指针。只需返回一个对象向量。请记住,向量包含它的内容。当您将对象放入向量中时,它将被复制

【讨论】:

谢谢,我的问题是:你什么时候建议我使用指向向量的指针?【参考方案2】:

像这样返回指向向量的指针的方法没有错:vector&lt;MyClass&gt;* myMethod()。但是你应该问自己一些问题,比如:

    它必须是指向向量的指针吗?不能只是vector&lt;MyClass&gt; 吗? 此方法是否也应为此向量分配内存? 这个方法的调用者应该delete/free这个内存吗?

关于你的第二个问题:只有在确实有必要时,我才会制作指向 MyClass (vector&lt;MyClass*&gt;) 对象的指针向量。它会给你的内存管理带来一些麻烦,所以让我们选择一种更简单的方法。

好的,我们来说说这个问题:这个方法是不是也应该给这个vector分配内存? 如果这个方法的目的是创建一个向量,那么是的,这个方法也应该为它分配内存:

vector<MyClass>* myMethod()

    vector<MyClass>* v = new vector<MyClass>;
    // initialize, fill or do whatever with this vector
    return v;

调用者应该清理一下:

    vector<MyClass>* v = myMethod();
    // do some stuff
    delete v; // clean up

如果目的只是检索指向调用者无法获取的某个特定向量的指针,则可能如下所示:

vector<MyClass> _x; // caller can not access _x but myMethod can

vector<MyClass>* myMethod()

    return &_x;

在这种情况下,调用者不应删除此向量:

    vector<MyClass>* v = myMethod();
    // do some stuff, don't delete v

【讨论】:

问题2:如果我返回一个指向向量的指针,该方法会自动为我分配内存吗?如果从内存中删除向量时我不返回指针?谢谢! 最后一个问题 ;) 如果我分配内存也不返回指针? (vector&lt;MyClass&gt;* v = new vector&lt;MyClass&gt;) 如果您返回向量 (vector&lt;int&gt; myMethod()) 并且调用者调用了vector&lt;int&gt; v; v = myMethod();,则从您的方法返回的向量副本被创建并存储到v【参考方案3】:

在 C++11 中,你可以简单地返回std::vector&lt;T&gt;,它会很快。因为std::vector支持move-semantic,所以没有一个temporary是无用的,这意味着分配给temporary的资源将被move-semantic函数窃取。

如果您的类型 T 管理资源,那么您也应该实现移动语义以及通常的复制语义。

【讨论】:

即使没有 C++11 返回 std::vector&lt;T&gt; 通常也可以。 RVO 早在 2011 年之前就已经存在。 @KennyTM:并非在所有情况下都保证 RVO。 @Nawaz:仅当首先满足复制省略的条件时,才会从局部变量自动移动。 @R.MartinhoFernandes:我不明白你的评论以及你为什么要这样说? @Nawaz:因为如果复制省略不会发生,那么自动移动也不会发生。【参考方案4】:

是的,你可以返回一个指向向量的指针,这意味着你希望能够修改这个向量。请记住,您不能返回指向局部变量的指针。

至于在向量中推指针 - 这取决于你想做什么,但你不必推指针。

【讨论】:

以上是关于C++中的指针和向量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 中的指针通过指针传递多维向量?

C++中的双指针向量

如何从 C++ 中的“指向对象的指针”向量访问对象

用向量 c++ 中的指针成员初始化对象

如何将唯一指针向量中的每个元素排入队列? (C++)

指向向量的 C++ 指针