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

时间:2014-03-07 17:39:58

标签: c++ vector

我正在做这个有B矢量的类。我正在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;
}

2 个答案:

答案 0 :(得分:5)

你可以简单地让向量默认构造(空),然后emplace_back进入它:

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

如果你坚持使用pre-C ++ 11编译器,你可以将B对象推送到它中:

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

std::vector::reserve的调用是为了避免在向量增大时重新分配。

答案 1 :(得分:0)

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

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