c++中vector的动态分配
C++ Dynamic allocation of vectors in vector?
我现在和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来构造一个新的向量,然后在堆栈中创建一个新的临时向量,然后将后一个向量的内容(空的,所以没有什么可做的)复制到第一个向量,然后销毁堆栈中的临时向量。但是编译器可能会完全优化这一点!
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 在c++中使用动态分配的问题
- 使用递归模板动态分配的多维数组
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 访问动态分配列表中的元素
- 为什么 std::equal_to会导致动态分配?
- 调用析构函数以释放动态分配的内存
- 动态分配Q_Property变量
- 在 C++ 中搜索动态分配的数组中的出现次数
- 动态分配的聊天数组打印缺失的数据和空
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 使用动态分配将 char* 复制到另一个字符**
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 动态分配和随机访问:Raw、Smart、Deque、Vector.为什么生得这么快,而deque却这么慢
- C++ 动态分配的 std::vector
- c++中vector的动态分配
- 为什么std::vector可能比原始动态分配的数组快?
- 当按值填充std::vector时,将删除动态分配的对象指针