在类构造函数上初始化向量

Posted

技术标签:

【中文标题】在类构造函数上初始化向量【英文标题】:Initializing a vector on a class constructor 【发布时间】:2014-03-07 17:39:58 【问题描述】:

我正在做这个具有 B 向量的 A 类。我在 A 类的构造函数上初始化向量(我不确定这是否是正确的方法,但它可以编译)。除此之外,我遇到了一个问题,因为我不希望在初始化向量时使用 B() 的默认构造函数来初始化自己,因为这让我做一个 for 循环来设置我想要的值。如果向量位置为 NULL 或大小为 0 就可以了;

class B
    int _t;
public:
    B() _t = 1; 
    B(int t) : _t(t)
 ;



class A
    std::vector<B> _b;
public:
    A(int size): _b(size)
        for(int i = 0; i < size; i++)
        _b[i].setNumber(i);
    
;  


int main() 
    int n = 3;
    A _a(n);
    return 0;

【问题讨论】:

如果一个零大小的向量是“好的”,那么不要调整它的大小。不要把 anything 放在初始化列表中,你会得到你想要的;一个空向量。 【参考方案1】:

您可以简单地让向量默认构造(空),然后将 emplace_back 放入其中:

A(int size) 
   _b.reserve(size);
   for(int i = 0; i < size; i++)
     _b.emplace_back(i);
   

如果你被 C++11 之前的编译器卡住了,你可以 push_back B 对象进去:

A(int size) 
   _b.reserve(size);
   for(int i = 0; i < size; i++)
     _b.push_back(B(i));
   

std::vector::reserve 的调用是为了避免随着向量大小的增长而重新分配。

【讨论】:

【参考方案2】:

它不编译。 B 类没有 setNumber 函数。将向量初始化为一个大小不需要您做任何事情。它只会默认构造等于指定大小的对象数。 Vector 有一个保留成员函数,允许您为一些元素分配足够的内存,而无需实际构造对象。也许这就是你所寻求的。显然,在您准备好执行某种形式的插入之前将其留空是另一种选择。希望发布的一个或多个答案会有所帮助。

class A
    std::vector<B> _b;
public:
    A(int size)
        _b.reserve(size);
    
;

【讨论】:

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

在类构造函数中拆分字符串

在类中创建多维 STL 向量

我可以使用在类构造函数中初始化的流类型的成员变量吗?

您可以在类和构造函数中进行初始化吗?对吗? [复制]

在类中声明数组并在构造函数中初始化

在类中定义多个构造函数