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

时间:2011-11-14 18:14:28

标签: c++ stl

我现在正在与vector合作,我有一个有趣的情况需要帮助。

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

vector< vector<int> > list;

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

当然我不知道零号会出现多少次 - 这是用户所依赖的。所以我也不知道,程序将添加多少向量。

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

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

但是这种结构在C ++中不起作用。

所以我的问题是,我应该如何应对这种情况才能使其发挥作用?或者我只是想错了,它应该以另一种方式完成?

感谢您的回答。

5 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:3)

在C ++ 11中:

list.emplace_back();

在C ++ 03中:

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

new动态分配一个对象并为其提供指针; vector::push_back()引用带到要复制的对象。当您想要自己动态分配对象时,只使用new - 如果您使用容器为您执行此操作,则不必使用new。当您使用{{1}}时,请确保使用智能指针(或非常仔细编写的代码)在完成后将其删除。

答案 2 :(得分:1)

你可以

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

在开始时,通过执行

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

当你得到0时,只需推回一个新的矢量。

答案 3 :(得分:1)

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

x.push_back(T);

内存管理由类本身完成。我希望我的确理解你。

你需要注意的一件事是,如果要推回的类有一个声明的默认构造函数。

答案 4 :(得分:1)

只做

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

如果你说“new”,你要求堆中的空间,但你不需要它。你已经在外部矢量中保留了空间!只需按一个矢量对象(而不是指针)就可以完成了!

高级:请注意,这个实际上首先通过将其大小增加1来构造外部向量中的新向量,然后在堆栈中创建一个新的临时向量,然后复制后面的内容(空的,所以无事可做)到第一个,然后破坏堆栈中的临时向量。但编译器可能会完全优化它!