在构造函数中初始化成员变量二维向量

Posted

技术标签:

【中文标题】在构造函数中初始化成员变量二维向量【英文标题】:initializing member variable 2D vector in constructor 【发布时间】:2021-01-16 07:16:00 【问题描述】:

我在一个类中有一个成员变量二维向量,像这样:

#include <vector>
...
class MyClass 
private:
    int vector_size;
    std::vector<std::vector<int> > vector_2d;
public:
    MyClass(int _vector_size);
    ~MyClass();
 // class MyClass

我想知道实现构造函数MyClass(int _vector_size) 以完全初始化向量以由_vector_size 空向量组成的最佳方法。我现在的代码如下(这在我编写的用于测试正确性的小玩具程序中运行良好),但我觉得temp_vec 和常量temp_vec.clear() 的声明可能有点多余。

MyClass::MyClass(int _vector_size):
vector_size(_vector_size)

    // initialize vector_2d
    vector_2d.clear();
    // push initialized 1D vectors
    for (int i = 0; i < vector_size; ++i) 
        std::vector<int> temp_vec;
        temp_vec.clear();
        vector_2d.push_back(temp_vec);
    

我还检查了其他帖子,例如 this、this 和 this,但我认为我的问题不同,因为我想要一个 指定大小的向量,它由 未指定大小的向量。

【问题讨论】:

旁注:清除已经为空的向量无效。它确实初始化向量。这是在自动调用的构造函数中完成的。 向量在内部存储它们的大小(您可以使用.size() 方法获得),因此将大小单独存储在您的类中充其量是多余的,并且可能存在错误。当你想知道它的大小时,只需查询向量。 【参考方案1】:

std::vector 有一个 constructor overload,它接受向量的大小。

你可以用它来初始化你的向量:

MyClass::MyClass(int size)
    : vector_size(size),
      vector_2d(size)


这会将vector_2d 初始化为具有size 元素。每个元素都是一个默认构造的std::vector&lt;int&gt; 对象(每个元素的类型)。

【讨论】:

谢谢!还有一个问题——我所做的绝对是多余的,但在功能上是正确的,对吧? @WannabeArchitect 至少没有错。 :) 但是您不需要 clear 调用,向量默认构造为空。【参考方案2】:

在您的代码中,vector_2d 首先默认初始化为空std::vector(因此调用clear() 是多余的),然后在构造函数的主体中进行修改。

您可以直接在成员初始化器列表中对其进行初始化。例如

// initializa vector_2d as containing _vector_size empty std::vector<int>
MyClass::MyClass(int _vector_size):
vector_size(_vector_size), vector_2d(_vector_size) 

【讨论】:

以上是关于在构造函数中初始化成员变量二维向量的主要内容,如果未能解决你的问题,请参考以下文章

请问java构造函数如何初始化成员变量的啊?

C++成员初始化列表(构造函数后加冒号:)(用于在构造函数中初始化类成员变量,可以避免使用构造函数体内的赋值语句,可以确保成员变量在对象构造之初就已经被正确初始化,提高代码的性能和可读性)

如何在构造函数中初始化 C++ 对象成员变量?

构造函数-用参数初始化表对成员变量初始化

构造函数-用参数初始化表对成员变量初始化

Kotlin类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )