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&lt;std::unique_ptr&lt;Animal&gt;&gt; 并忘记手动内存管理。

【讨论】:

让我补充一点,std::shared_ptr&lt;Animal&gt; 可能是更好的选择。但是,unique_ptr&lt;&gt;shared_ptr&lt;&gt; 都不是完美的。 @cmaster 我会认为动物园拥有动物,所以shared_ptr 不是最佳选择。但我认为这两种方式都没有足够的信息。 我不想以任何方式批评你,我只是想添加到你的答案中,可能会有更好的选择。在类似情况下,有大量的用例需要shared_ptr @cmaster 不用担心,我没有把它当作批评:-) @bttb 据我所知,您只需要循环 animals 删除 zoo 析构函数中的元素。对于其他类,听起来默认的、编译器生成的析构函数就足够了。

以上是关于c++中vector<vector<T>>怎么初始化vector<T>?的主要内容,如果未能解决你的问题,请参考以下文章

c++中vector<T>中的内存管理

C++ vector<T> 其中 T 是类中的结构

C++ 模板类中使用vector

在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>

从 Swift 调用 C++ - std::vector<T> 的等价物

c++ vector详解