注意
:此文档中所有的初始化皆依据以下容器
1 | //创建vector<int>容器test,并为其赋值 |
创建一个空容器
C<T> test;
C是容器类型名,如vector;
T是元素类型,如int或string;
适用于所有容器
将一个容器初始化为另一个容器的副本
1 | //创建容器testInitCopy,并将其初始化为容器test的副本 |
- 将一个容器复制给另一个容器时,类型必须匹配:
容器类型
和元素类型
都必须相同。- 适用于
所有容器
初始化为一段元素的副本
注意:使用迭代器初始化一个容器时,不要求容器类型相同。容器内的元素类型也可以不相同,只要他们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。
1 | //容器testInitTwoIter和容器test类型相同,而使用的迭代器则是test.begin()和test.end() |
1 | //容器testchar和容器testint类型不同 |
输出结果:
1 | A B C D E F G H I J |
或者初始化一段元素副本:
1 | vector<char>::iterator charIter1=testchar.begin()+2,charIter2=testchar.end()-2; |
输出结果:
67
68
69
70
71
72
分配和初始化指定数目的元素(只适用于顺序容器)
创建指定数目元素的容器并提供初始化式
创建
顺序容器
时,可显式指定容器大小
和一个(可选的)元素初始化式。容器大小
可以是常量
或非常量表达式
,元素初始化式则必须是可用于初始化其元素类型的对象的值。
1 | const vector<int>::size_type vectorSize=10; |
输出结果:
Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi
**注意
**:创建容器时,除了指定元素个数,还可以选择是否提供元素初始化式。也可以只指定容器大小。
创建指定数目元素的容器但不提供初始化式
1 | //创建vectorSize个元素的容器,不显式提供初始化式(值初始化为0) |
或者这样:
1 | extern unsigned get_word_count(const string &file_name); |
不提供元素初始化式规则:
不提供元素初始化式时,标准库将为该容器实现
值初始化
。
采用这种类型的初始化,元素类型必须是内置或者复合类型,或者提供了默认构造函数的类类型。
如果元素类型没有默认构造函数,则必须显式指定其元素初始化式。
知识补充:
值初始化
**:如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化**(value initializationd)。这个由库生成的初始值将用来初始化容器中的每一个元素,具体值为何,取决于存储在容器中元素的数据类型。
元素类型可能是没有定义任何构造函数的类类型,这种情况下,标准库仍产生一股带初始值的对象,这个对象的每个成员进行了值初始化。
注意:接受容器大小做形参的构造函数只适用于顺序容器
,而关联容器不支持这种初始化。