【问题标题】: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 放在初始化列表中,你会得到你想要的;一个空向量。

标签: c++ vector


【解决方案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);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2021-12-23
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多