C++标准库
标准模板库
STL(standard template library,标准模板库)是C++标准库的核心,它深刻影响了标准库的整体结构。
STL内的所有组件都由template(模板)构成,所以其元素可以是任意类型。STL建立了一个框架,在此框架下你可以提供其他集合类或算法,与现有的组件搭配共同运作。
STL组件
-
容器:用来管理某类对象的集合。
-
迭代器:用来在一个对象集合内遍历元素。
-
算法:用来处理集合内的元素。
-
STL的基本观念是将数据和操作分离
容器
-
序列式容器:这是一种有序集合,其内每个元素均有确凿的位置——取决于插入时机和地点,与元素值无关。STL提供了5个定义好的序列式容器:array、vector、deque、list和forward_list。
-
关联式容器:这是一种已排序集合,元素位置取决于其value(或key——如果元素是个key/value pair)和给定的某个排序准则。STL提供了4个关联式容器:set、multiset、map和multimap
-
无序容器:这是一种无需集合,其内每个元素的位置无关紧要,唯一重要的是某特定元素是否位于此集合内。STL内含4个预定义的无序容器:unordered_set、unordered_multiset、unordered_map和unordered_multimap。
序列式容器
STL内部预先定义好的序列式容器:
-
Array(其class名为array)
-
Vector
-
Deque
-
List(singly/double linked)
Vector
Vector 将其元素置于一个dynamic array中管理。它允许随机访问。在array尾部附加元素或移除元素都很快速,但是在array中段或起始段安插元素就比较费时,因为安插点之后的所有元素都必须移动。
一下例子针对整型类型定义一个vector,插入6个元素
#include<vector> //Vector的头文件
#include<iostream>
using namespace std;
int main(){
vactor<int> coll; //声明式建立一个“元素类型为int”的vector
for(int i = 1;i<=6;i++){
coll.push_back(i);//插入元素
}
for(int i=0;i<coll.size();i++){
cout<<coll[i]<<' ';//输出元素
}
cout<<endl;
return 0;
}
Deque
deque式“double-ended queue”的缩写,他是一个dynamic array,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。在中间安插元素比较费时。
#include<deque> //导入deque头文件
#include<iostream>
using namespace std;
int main(){
deque<float> coll;//声明一个空的浮点数集合
for(int i=1;i<=6;i++){
coll.push_front(i*1.1);//安插元素,安插于前端!!push_back()安插于末尾!!
}
for(int i=0;i<coll.size();i++){
cout<<coll[i]<<' ';
}
cout<<endl;
return 0;
}
Array
array对象乃是在某个固定大小的array内管理元素。因此你不可以改变元素个数,只能改变元素值。你必须在建立时就指名其大小!!!
#include<array>//导入array头文件
#include<string>
#include<iostream>
using namespace std;
int main(){
array<string,5> coll = {"hello","world"};//建立一个带有5个类型为string的元素。
for(int i=0;i<coll.size();i++){
cout<<i<<":"<<coll[i]<<endl;
}
return 0;
}
注意:元素个数是array类型的一部分,因此array<int,5>和array<int,10>是两个不同的类型,不能对此二者进行赋值或比较!!
List
list<>由双向链表(doubly linked list)实现而成。list内的每个元素都以一部分内存指示其前导元素和后继元素。
List不提供随机访问,因此如果你要访问第10个元素,就必须沿着链表以此走过前9个元素。因为一般的元素访问动作会花费线性时间,因为平均距离和元素数量成比例。这比vector和deque提供的摊提式(amortized)常量时间,效率差很多。
List优点是:在任何位置上执行安插或删除动作都非常迅速,因为只需改变链接(link)就好。这表示在list中段处移动元素比在vector和deque块得多。
#include<list>
#include<iostream>
using namespace std;
int main(){
list<char> coll;
for(char c='a';c<='z';++c){
coll.push_back(c);
}
for(auto elem:coll){
cout<<elem<<" ";
}
while(!coll.empty()){
cout<<coll.front()<<" ";
coll.pop_front();//pop_front()并不会返回被删除元素,所有无法将上述两个元素和为一起!!
}
cout<<endl;
return 0;
}
Forward List
forward_list<>是一个由元素构成的单向(singly)linked list。就像寻常list那样,每个元素由自己一段内存,为了节省内存,它只指向下一个元素。
forwar list原则上是一个受限的list,不支持任何“后退移动”和“效率低下”的操作。因此它提供成员函数如push_back()乃至size();
#include<forward_list>
#include<iostream>
using namespace std;
int main(){
forward_list<long> coll={2,3,5,7,11,13,17};
coll,resize(9);//使用resize()改变元素个数
coll.resize(10,99);
for(auto elem:coll){
cout<<elem<<" ";
}
cout<<endl;
return 0;
}

浙公网安备 33010602011771号