Vector C ++调整大小

时间:2018-01-08 19:34:08

标签: c++ c++11

我正在查看Stack Overflow上的一个答案,为2d Vector创建一个类。解决方案涉及在创建外部矢量时初始化内部矢量。

class A{
public:
   A(int dim1,int dim2):v(dim1,std::vector<int>(dim2)){}
private:   
   std::vector< std::vector<int> > v;
};

class A{
public:
   A(int dim1,int dim2){v.resize(dim1,std::vector<int>(dim2));}
private:   
   std::vector< std::vector<int> > v;
};

我知道矢量可以像这样初始化

size=4; value =10; std::vector<int> A (size,value);

然而,我没有直观的感觉,如何将矢量初始化为std :: vector(size),而变量对象不存在,就像在初始代码片段中设置dim2时所发生的那样。我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

要从概念上开始,v(dim1, X)v设置为dim1大小,并将所有值初始化为X。由于v的类型为std::vector< std::vector<int> >X的类型必须为std::vector<int>

std::vector<int>(dim2)就是这样,创建一个大小为std::vector<int>的内联dim2,并根据提供的SO问题和文档将所有值初始化为0在评论herehere中。 (此处使用构造函数#3,而不是#2。)

因此,结果是dim1 dim2 std::vector< std::vector<int> >,其中所有int个变量都已初始化为0

答案 1 :(得分:2)

初始化具有大小但没有值参数的std::vector时,对象的所有实例都是值初始化的。对于类类型,这意味着调用默认构造函数,对于基本类型和聚合,这意味着所有内容都将设置为零。

除非你使用特殊的分配器,或者你使用的是具有用户编写的构造函数的类类型,该类型的构造函数无法初始化某些成员(这真的很糟糕),所以不可能有任何未初始化的内容使用vector

这是文档:http://en.cppreference.com/w/cpp/container/vector/vector。它表明只采用一个大小的构造函数&#34;默认插入&#34;。正如此页面:http://en.cppreference.com/w/cpp/concept/DefaultInsertable讨论,&#34;默认插入&#34;使用默认分配器(和大多数分配器)调用placement new,这会进行值初始化。

在这种特定情况下,内部矢量是整数矢量,外部矢量是整数矢量矢量。这意味着:

  1. 外部向量将由dim1个相同的副本组成(在值中,不是身份意义上;它们是不同的向量,但填充相同)向量。
  2. 内部向量由dim2个整数组成,全部值为0。