我现在正在与vector
合作,我有一个有趣的情况需要帮助。
我有一个向量向量,定义如下:
vector< vector<int> > list;
我使用cin >> helpVar;
从标准输入加载数字,每当我得到0(零)时,我想创建新的int向量,这将被放入这个“主容器”list
。
当然我不知道零号会出现多少次 - 这是用户所依赖的。所以我也不知道,程序将添加多少向量。
但我不知道,究竟是怎么做到的。如果我使用C#或其他类似垃圾收集的语言,我可能会写:
if(helpVar == 0)
{
list.push_back(new vector<int>);
}
但是这种结构在C ++中不起作用。
所以我的问题是,我应该如何应对这种情况才能使其发挥作用?或者我只是想错了,它应该以另一种方式完成?
感谢您的回答。
答案 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来构造外部向量中的新向量,然后在堆栈中创建一个新的临时向量,然后复制后面的内容(空的,所以无事可做)到第一个,然后破坏堆栈中的临时向量。但编译器可能会完全优化它!