c++中vector<vector<T>>怎么初始化vector<T>?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中vector<vector<T>>怎么初始化vector<T>?相关的知识,希望对你有一定的参考价值。
参考技术A比如初始化2×3的二维vector:
vector<vector<int>> v2;for(int i=0; i<2; i++)
v2.push_back(vector<int>(3));
v2[1][2] = 123;
cout << v2[1][2];追问
定义时不能初始化吗?
追答定义时也可以初始化,上述初始化可改为:
vector<vector<int>> v2(2, vector<int>(3));本回答被提问者采纳c++中vector<T>中的内存管理
【中文标题】c++中vector<T>中的内存管理【英文标题】:memory management in vector<T> in c++ 【发布时间】:2014-02-17 13:35:52 【问题描述】:我有一个名为 Animal 的类,它有一个虚拟方法,因此该类成为虚拟类。
class Animal
virtual double eat() = 0;
;
我还有两个类,它们是猫和狗,这些类继承自动物。
还有第四类 -zoo- 并且它有一个字段
vector<Animal *> animals;
我将猫和狗实例推送到动物园对象的动物向量。
在任何时候我都想清除动物园实例,并且我还希望删除该对象的向量。我也想删除这个对象的向量对象。
我到底应该怎么做。 除了 zoo 之外的所有类都只有浮点字段(没有指针)。 (浮动a,b等) 所以我们可以说没有必要处理动物对象,因为它们没有任何指针。
我应该在哪里写析构函数。在基类(动物)或子类(猫 - 狗)或无处 或者我应该如何编写这些析构函数。
【问题讨论】:
【参考方案1】:首先,你需要声明一个给Animal
一个虚拟析构函数:
class Animal
virtual double eat() = 0;
public:
virtual ~Animal()
;
这是必需的,以便在 Animal
指针上调用 delete
将调用指针指向的对象类型的析构函数。在没有虚拟析构函数的情况下执行此操作会导致未定义的行为。
接下来,你需要在所有动态分配的Animals
上调用delete
:
for (auto a : animals)
delete a;
然后,你可以清除向量:
animals.clear();
如果您需要将animals
用于其他用途,这是必需的。您无需在 zoo
析构函数中执行此操作。
或者,您可以使用std::vector<std::unique_ptr<Animal>>
并忘记手动内存管理。
【讨论】:
让我补充一点,std::shared_ptr<Animal>
可能是更好的选择。但是,unique_ptr<>
和 shared_ptr<>
都不是完美的。
@cmaster 我会认为动物园拥有动物,所以shared_ptr
不是最佳选择。但我认为这两种方式都没有足够的信息。
我不想以任何方式批评你,我只是想添加到你的答案中,可能会有更好的选择。在类似情况下,有大量的用例需要shared_ptr
。
@cmaster 不用担心,我没有把它当作批评:-)
@bttb 据我所知,您只需要循环 animals
删除 zoo
析构函数中的元素。对于其他类,听起来默认的、编译器生成的析构函数就足够了。以上是关于c++中vector<vector<T>>怎么初始化vector<T>?的主要内容,如果未能解决你的问题,请参考以下文章
在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>