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;
}
posted @ 2022-03-27 10:04  霜鱼CC  阅读(26)  评论(0)    收藏  举报