c++中vector的动态分配

C++ Dynamic allocation of vectors in vector?

本文关键字:动态分配 vector c++      更新时间:2023-10-16

我现在和vector一起工作,我有一个有趣的情况,我需要帮助。

我有一个向量的向量,定义如下:
vector< vector<int> > list;

我正在使用cin >> helpVar;从标准输入加载数字,每次当我得到0(零)时,我想创建一个新的int向量,它将被放入这个"主容器"list

当然我不知道,0会出现多少次——这取决于用户。所以我也不知道,程序会添加多少向量。

但是我不知道该怎么做。如果我使用c#或其他类似垃圾收集的语言,我可能只会写:

if(helpVar == 0)
{
   list.push_back(new vector<int>);
}

但是这个结构在c++中不起作用。

所以我的问题是,我应该如何处理这种情况,使它工作?或者我只是想错了,应该用另一种方式来做?

谢谢你的回答

list.push_back(vector<int>());

vector<int>()创建一个临时的vector<int>对象并初始化它(即,它调用该对象的默认构造函数)。push_back然后将该临时对象复制到list中。

在c#(和"其他垃圾回收语言")中,new用于创建新对象,其生命周期由垃圾回收器控制。

在c++中,new只用于动态分配对象(你要负责管理它的生命周期,通过使用智能指针)。语法T()(其中T是类型的名称)用于创建临时对象。

c++ 11:

list.emplace_back();
在C + + 03:

list.push_back(std::vector<int>());

new动态分配一个对象并给你一个指向它的指针;vector::push_back()接受一个对象的引用,它将复制该对象。只有当你想自己动态分配对象时才使用new -如果你使用容器来为你做这件事,那就没有必要了。当您使用new时,请确保使用智能指针(或非常仔细编写的代码)在完成后删除它。

你可以

list.push_back(vector<int>());

开头,通过

helpVar添加到最近的向量中
list.back().push_back(helpVar);

,当你得到一个0,只是推回一个新的向量。

在c++中你可以这样做:

x.push_back(T);

内存管理由类本身完成。我希望我没理解错。

您必须查找的一件事是,如果您要推回的类声明了默认构造函数

只管做

list.push_back(vector<int>());

如果你说"new",你是在请求堆中的空间,但你并不需要。外部向量中已经预留了空间!只要推一个矢量对象(不是指针),你就完成了!

Advanced:注意,实际上是首先在外层向量中通过将其大小增加1来构造一个新的向量,然后在堆栈中创建一个新的临时向量,然后将后一个向量的内容(空的,所以没有什么可做的)复制到第一个向量,然后销毁堆栈中的临时向量。但是编译器可能会完全优化这一点!