STL中容器的构造函数

注意:此文档中所有的初始化皆依据以下容器

1
2
3
4
//创建vector<int>容器test,并为其赋值
vector<int> test;
for(int i=0;i<10;i++)
test.push_back(i);

创建一个空容器

C<T> test;
C是容器类型名,如vector;
T是元素类型,如int或string;
适用于所有容器

将一个容器初始化为另一个容器的副本

1
2
3
4
5
6
7
//创建容器testInitCopy,并将其初始化为容器test的副本
vector<int> testInitCopy(test);
cout<<"vector<int> testInitCopy(test):"<<endl
<<"C<T> testInitCopy(test)"<<endl;
for(vector<int>::iterator textInitCopyIter=testInitCopy.begin();
textInitCopyIter!=testInitCopy.end();textInitCopyIter++)
cout<<*textInitCopyIter<<" ";
  • 将一个容器复制给另一个容器时,类型必须匹配:容器类型元素类型都必须相同。
  • 适用于所有容器

初始化为一段元素的副本

注意:使用迭代器初始化一个容器时,不要求容器类型相同。容器内的元素类型也可以不相同,只要他们相互兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。

1
2
3
4
5
6
7
8
//容器testInitTwoIter和容器test类型相同,而使用的迭代器则是test.begin()和test.end()
//则在这个实例中也是将容器test完全复制给容器testInitTwoIter
//(与vector<int> testInitCopy(test)结果一致,实现方式不同)
vector<int> testInitTwoIter(test.begin(),test.end());
cout<<"vector<int> testInitTwoIter(test.begin(),test.end()):"<<endl;
for(vector<int>::iterator testInitTwoIterBegin=testInitTwoIter.begin();
testInitTwoIterBegin!=testInitTwoIter.end();testInitTwoIterBegin++)
cout<<*testInitTwoIterBegin<<" ";
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//容器testchar和容器testint类型不同
//元素赋值使用类型转换char->int(字符类型的ASCII码值)
vector<char> testchar;
for(char i='A';i!='K';i++){
testchar.push_back(i);
}
//遍历输出testchar
for(vector<char>::iterator testiter=testchar.begin();
testiter!=testchar.end();testiter++)
cout<<*testiter<<" ";
cout<<endl;
//将testin初始化为testchar的副本(类型转换)
vector<int> testint(testchar.begin(),testchar.end());
//遍历输出testint
for(vector<int>::iterator testintiter=testint.begin();
testintiter!=testint.end();testintiter++){
cout<<*testintiter<<" ";
}

输出结果:

1
2
A  B  C  D  E  F  G  H  I  J
65 66 67 68 69 70 71 72 73 74

或者初始化一段元素副本:

1
2
3
4
5
6
7
vector<char>::iterator charIter1=testchar.begin()+2,charIter2=testchar.end()-2;
vector<int> testint(charIter1,charIter2);
//遍历输出testint
for(vector<int>::iterator testintiter=testint.begin();
testintiter!=testint.end();testintiter++){
cout<<*testintiter<<" ";
}

输出结果:

67 68 69 70 71 72

分配和初始化指定数目的元素(只适用于顺序容器)

创建指定数目元素的容器并提供初始化式

创建顺序容器时,可显式指定容器大小和一个(可选的)元素初始化式。
容器大小可以是常量非常量表达式,元素初始化式则必须是可用于初始化其元素类型的对象的值。

1
2
3
4
5
6
7
const vector<int>::size_type vectorSize=10;
//创建含有vectorSize个元素的vector<string>容器,容器内每个元素都被初始化为"Hi"字符串
vector<string> test(vectorSize,"Hi");
for(vector<string>::iterator testiter=test.begin();
testiter!=test.end();testiter++){
cout<<*testiter<<" ";
}

输出结果:

Hi Hi Hi Hi Hi Hi Hi Hi Hi Hi

注意:创建容器时,除了指定元素个数,还可以选择是否提供元素初始化式。也可以只指定容器大小。

创建指定数目元素的容器但不提供初始化式
1
2
//创建vectorSize个元素的容器,不显式提供初始化式(值初始化为0)
vector<int> testint(vectorSize);

或者这样:

1
2
extern unsigned get_word_count(const string &file_name);
vector<string> test(get_word_count("Chimera"))

不提供元素初始化式规则:

不提供元素初始化式时,标准库将为该容器实现值初始化
采用这种类型的初始化,元素类型必须是内置或者复合类型,或者提供了默认构造函数的类类型。
如果元素类型没有默认构造函数,则必须显式指定其元素初始化式。

知识补充:

值初始化:如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化(value initializationd)。这个由库生成的初始值将用来初始化容器中的每一个元素,具体值为何,取决于存储在容器中元素的数据类型。
元素类型可能是没有定义任何构造函数的类类型,这种情况下,标准库仍产生一股带初始值的对象,这个对象的每个成员进行了值初始化。

注意:接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化

全文完,若有不足之处请评论指正。

扫描二维码,分享此文章

本文标题:STL中容器的构造函数
文章作者:ZhaLiPeng
发布时间:2015年08月18日 12时44分
本文字数:本文一共有1.2k字
原始链接:https://imzlp.me/posts/42105/
许可协议: CC BY-NC-SA 4.0
转载请保留原文链接及作者信息,谢谢!
您的捐赠将鼓励我继续创作!