如何访问结构中的向量?

时间:2016-10-27 08:46:40

标签: c++ vector structure

我想知道如何访问结构中的向量,如下所述

#include<vector>
#include<iostream>
#include<stdlib.h>

using namespace std;

struct Hello{
    vector<int>vec ;
};

struct Hello *h[1][1];

int main()
{
    struct Hello *v = (struct Hello *)malloc(sizeof(struct Hello));
    h[0][0]=v;
    0][0]->vec.push_back(13);
    //How to add 13 to vector vec?
    //It shows an error. But why?
    cout<<h[0][0]->vec.at(0)<<endl;
    return 0;
}

2 个答案:

答案 0 :(得分:3)

这是你的问题:

struct Hello *v = (struct Hello *)malloc(sizeof(struct Hello));

(另外,struct每次在该行中使用时都是多余的。)

它为Hello分配空间,但不构造它。
并且Hello有一个非平凡的ctor,因为它的成员std::vector有一个,因此省略对ctor的调用是错误的。

使用placement-new到就地构造Hello,或者更好地分配和构造C ++方式:

Hello *v = new Hello;
// andd later deallocate
delete v;

最好,完全避免动态分配:

Hello h;

会员访问使用.或指针->

答案 1 :(得分:1)

这不是你用C ++编写代码的方式。

首先,正如评论中正确提到的那样,不要使用malloc。如果需要动态内存分配,请使用new。否则你会有非构造的对象,就像你已经被告知过一样。

其次,如果不需要,请不要使用new。如果您需要动态内存分配,很可能您希望使用智能指针来管理此内存,例如std::unique_ptr。要构建unique_ptr<T>,请使用std::make_unique<T>()函数。使用 make_unique 将使您无需零件成本即可实现无泄漏和异常安全的程序。使用make_unique()可以防止由于异常而导致泄漏的一些棘手情况,并在编写代码时节省几次击键。当然,零成本。请参阅GotW #89 Solution: Smart Pointers

第三,你很可能甚至不需要动态内存分配。这不是Java,我们喜欢在堆栈上分配东西。请记住,std::vector本身会动态内存分配来存储其缓冲区。由于移动语义,它可以在运行时有效地移动此存储。在动态内存中分配vector本身没有多大意义。见Why should C++ programmers minimize use of 'new'?

搜索每个强调的项目以获取详细信息。