我正在查看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时所发生的那样。我错过了什么吗?
答案 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
在评论here和here中。 (此处使用构造函数#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,这会进行值初始化。
在这种特定情况下,内部矢量是整数矢量,外部矢量是整数矢量矢量。这意味着:
dim1
个相同的副本组成(在值中,不是身份意义上;它们是不同的向量,但填充相同)向量。dim2
个整数组成,全部值为0。