C++ C++;向量中向量的动态分配?

C++ C++;向量中向量的动态分配?,c++,stl,C++,Stl,我现在正在使用vector,我有一个有趣的情况需要帮助 我有一个向量向量,定义如下: vector< vector<int> > list; 但是这个构造在C++中是不起作用的。 所以我的问题是,我应该如何处理这种情况,使其发挥作用?还是我只是想错了,应该用另一种方式去做 谢谢你的回答。列表。向后推(vector()); list.push_back(vector<int>()); vector()创建一个临时的vector对象并对其进行初始化(即调用该

我现在正在使用
vector
,我有一个有趣的情况需要帮助

我有一个向量向量,定义如下:

vector< vector<int> > list;
<>但是这个构造在C++中是不起作用的。 所以我的问题是,我应该如何处理这种情况,使其发挥作用?还是我只是想错了,应该用另一种方式去做

谢谢你的回答。

列表。向后推(vector());
list.push_back(vector<int>());
vector()
创建一个临时的
vector
对象并对其进行初始化(即调用该对象的默认构造函数)<代码>向后推然后将该临时对象复制到
列表中

在C#(和“其他垃圾收集语言”)中,
new
用于创建新对象,其生存期由垃圾收集器控制

<> > C++ > <代码> < < /> >仅用于动态分配对象(并且您负责使用智能指针管理其生存期)。语法
T()
(其中
T
是类型的名称)用于创建临时对象。

您可以

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

当你得到一个<代码> 0 <代码>时,推回一个新的向量。

C++,你可以这样做:

x.push_back(T);
内存管理由类本身完成。我希望我对你的理解是正确的

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

只需执行即可

list.push_back(vector<int>());
list.push_back(vector());
如果你说“new”,你是在请求堆中的空间,但你不需要。您已经在外向量中保留了空间!只要推一个向量对象(不是指针),就可以了

高级:请注意,此实际上首先通过将外部向量的大小增加1在外部向量中构造一个新向量,然后在堆栈中创建一个新的临时向量,然后将后一个向量的内容(空,因此无需执行)复制到第一个向量,然后销毁堆栈中的临时向量。但是编译器可能会完全优化它

在C++11中:

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

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

new
动态分配一个对象并为您提供指向该对象的指针<代码>向量::push_back()获取一个对象的引用,它将复制该对象。仅当您希望自己动态分配对象时才使用
new
——如果您使用容器来为自己分配对象,则不需要这样做。当您确实使用
new
时,请确保在完成后使用智能指针(或非常仔细编写的代码)将其删除。

对于记录,如果您有指向向量的向量if指针,则该操作将有效。它根本就不是惯用的(尽可能避免
new
),这样做时要小心内存泄漏的危险。请看:@delnan这实际上是个坏建议。不要“尽可能避免
new
”,因为这样做通常需要复制,这可能会很昂贵。每种语言结构都有它的优点,所以明智地使用它们,忘记“总是”的规则。@GiovanniFunchal:这是非常有争议的。有很多C++习语都是完全有效和安全的,所有这些都“尽可能避免<代码>新< /代码>。”乔瓦尼弗查尔:“除了Kerrek所说的,考虑:过度复制,如果它变成了表演的停止,可以比内存管理混乱更容易补救(无论是泄露还是任何类型的UB)。智能指针变得容易得多,但是,2/3个“C++”程序员似乎无法使用这些代码……在当代C++中,你甚至可以说“代码>列表。
list.emplace_back();
list.push_back(std::vector<int>());