C++学习:STL

本文详细介绍了C++STL的核心组成部分,包括算法、容器(如vector、deque、list、stack、queue、set、map等)和迭代器的使用方法,重点展示了vector、deque和list等容器的特点及常用成员函数。
摘要由CSDN通过智能技术生成

简介

    STL(Standard Template Library,标准模板库),由惠普实验室开发,主要出现在C++中。STL在广义上分为三类:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通过迭代器进行连接。在惠普实验室最初发行版本中STL被组织成48个头文件,而在C++标准中,STL被组织为13个头文件:<iterator>、<functional>、<vector>、<deque>、<list>、<queue>、<stack>、<set>、<map>、<algorithm>、<numeric>、<memory>和<utility>。

容器

    STL中的容器分为两大类:序列式(元素有固定位置,元素位置和插入顺序有关,和元素本身无关)和关联式。

    其中序列式容器包含vector、deque、list、stack和queue,关联式容器包含set、multiset、map和multimap。

vector

    vector(向量),将元素放置在一个动态数组,支持随机存取元素,特点:在尾部插入删除元素快,在中间和头部部插入删除元素较慢。

    使用:

1、头部包含头文件

    在头文件处包含vector头文件:

#include <vector>

2、构造vector对象

    在使用处构造vector对象,语法如下:

#include <vector>


vector<T> name;

    其中name就是我们vector对象的名字,T是vector容器中想要存放元素的类型,常见类型有int、float、string等。

3、成员函数

对vector成员函数的学习来源vector成员函数

        1、vector()

创建一个向量。

        2、vector(int nSize)

创建一个大小为nSize的vector。

        3、vector(int nSize, const t& t)

创建一个大小为nSize,均值为t的vector。

        4、vector(const vector&)

复制构造函数。

        5、vector(begin, end)

复制另一个数组区间[begin, end)的元素到到vector中。

        6、void push_back(const T& x)

尾部添加x。

        7、iterator insert(iterator it, const T& x)

在it指向的元素前增加元素x。

        8、iterator insert(iterator it, int n, const T& x)

在it指向的元素之前添加n个元素,值为x。

        9、iterator insert(iterator it, const_iterator first, const_iterator last)

在it指向的元素之前添加类型相同的区间在[first, last)之间的元素。

        10、iterator erase(iterator it)

删除it指向的元素。

        11、iterator erase(iterator first, iterator last)

删除区间[first, last)的元素。

        12、void pop_back()

删除向量最后一个元素。

        13、void clear()

清空所有元素。

        14、reference at(int pos)

返回pos元素的引用。

        15、reference front()

返回首元素的引用。

        16、reference back()

返回尾元素的引用。

        17、iterator begin()

返回向量头指针,指向第一个元素。

        18、iterator end()

返回向量尾指针,指向向量最后一个元素的下一个位置。

        19、reverse_iterator rbegin()

反向迭代器,指向最后一个元素。

        20、reverse_iterator rend()

反向迭代器,指向第一个元素之前的位置。

        21、bool empty() const

判断向量是否为空,空代表向量中没有元素。

        22、int size() const

返回向量中元素个数。

        23、int capacity() const

返回当前向量中所能容纳的最大元素值。        

        24、int max_size() const

返回最大可允许的vector元素数量值。

        25、void swap(vector&)

交换两个同类型向量的数据。

        26、void assign(int n, const T& x)

设置元素个数为n,每个的值都为x。

        27、void assign(const_iterator first, const_iterator last)

将区间[first, end)的元素设置成当前向量元素。

    deque

学习来源:双端队列

deque(双端队列),在队列两端可以进行扩展或者收缩的序列化容器。同时,存储数据的空间是一段一段等长连续空间构成,各段空间并不一定连续,可能位于内存不同区域,使用一个中控器(指针数组)map来指向这些一段一段的空间,如果当前段空间用完,则添加一个新的空间并将其链接在头部或者尾部,特殊的存储结构导致deque的迭代器随机访问的速度低于vector。

     1、头文件

#include <deque>

    2、构造deque对象

#include <deque>


deque<T> name;

其中T是deque对象的数据类型,name是队列的名字。

    3、成员函数

定义deque对象:

#include <deque>


deque<T> name1;           //创建一个空队列name1,T为队列元素类型,执行默认初始化
deque<T> name2(name1);    //name2中包含name1中所有的元素
deque<T> name2 = name1;   //等价于name2(name1)
deque<T> name3(n, value); //队列大小为n,n个元素的值都为value
deque<T> name4(n);        //包含n个元素,重复执行初始化
deque<T> name5{1, 2, 3.....};//name5包含了花括号中所有的元素
deque<T> name6 = {1, 2, 3, 4....};//等价于name5   

迭代器函数:

#include <deque>


deque<int> v1{1, 2, 3, 4};
v1.begin();                   //指向v1首元素的迭代器
v1.end();                     //指向v1尾元素的下一个位置的迭代器
v1.rbegin();       //指向v1尾元素的反向迭代器,rbegin()指向尾元素,rbegin()-1指向倒数第二个元素
v1.rend();         //指向v1头元素的前一个位置的迭代器,rend()-1指向第一个元素
v1.cbegin();       //指向v1首元素的迭代器,增加了const属性,不能用于修改元素
v1.cend();         //指向v1尾元素的下一个位置,增加const属性,不能用于修改元素
v1.crbegin(); //指向v1尾元素的反向迭代器,与rbegin()相同,但是增加了const属性,不能用于修改元素
v1.crend();   //指向v1头元素的前一个位置的反向迭代器,和rend()相同,增加了const属性不能修改元素

其他函数:

#include <deque>


deque<T> v1{1, 2, 3, 4};
v1.size();               //返回v1中的元素个数。
v1.max_size();           //返回v1最多能容纳元素的个数。
v1.resize(n);            //改变v1的size,改为n。
v1.empty();              //判断v1是否为空。
v1.shrink_to_fit();      //减少v1容量,用以适应元素个数。
v1.at(index);            //index为索引,但必须合法。
v1.front();              //返回v1的第一个元素。
v1.back();               //返回v1的最后一个元素。
v1.assign();             //用新的元素替换v1中的旧元素。
v1.push_back();          //v1尾部添加一个元素。
v1.push_front();         //在v1头部添加一个元素。
v1.pop_back();           //移除v1尾部的一个元素。
v1.pop_front();          //删除v1头部的一个元素。
v1.insert();             //添加元素。
v1.erase();              //删除元素。
v1.clear();              //清空元素。
v1.swap();               //交换元素。

    list

学习来源list

list是序列化容器,可以在list任何位置进行插入或删除元素,时间复杂度都是O(1),并可以在两个方向进行迭代。list使用双向链表实现,通过next、prev指针链接成顺序表,但是list不能通过位置直接访问元素,要访问元素只能迭代过去,时间复杂度为线性。因为需要存储next、prev等来保持元素关联,致使存储密度较低。

    1、头文件

#include <list>

    2、构造list对象

#include <list>


list<T> list1;      //默认构造函数,构造一个空容器。
list<T> list2(size_type count, const T& value); //容器大小为count,值均为value。

这里只是对构造list对象的函数列举了两个,其他的构造函数大家可以自己去详查。

    3、成员函数

#include <list>


list<int> list1{1, 2, 3, 4};
list1.begin();          //返回指向list首元素的迭代器
list1.end();            //返回指向lsit尾元素的下一个元素的位置
lsit1.empty();          //判断容器是否为空,如果容器为空,则list1.begin() == list1.end()
list1.clear();          //清空所有元素
list1.insert();         //插入元素

list的成员函数很多,这里只列出一部分,剩下的感兴趣的读者可以自己去详细了解。

    stack

学习来源:stack

stack(堆栈),一个先进先出的线性数据结构。这里对栈元素的插入删除操作只能在尾结点进行,而查看也只能查看尾结点。

    头文件

#include <stack>

    构造stack对象

#include <stack>


stack<T> stk1;     //默认构造形式
stack<T> stk2(const stack &stk1);  //拷贝构造函数

    成员函数

#include <stack>


stack<int> stk;
stk.size();        //返回栈中元素的个数
stk.top();         //返回栈顶元素
stk.pop();         //返回栈顶元素并将其从栈中删除
stk.push(e);       //向栈中添加元素e
stk.empty();       //判断栈是否为空

还有其他许多成员函数,这里不浪费篇幅一一列举,读者可自行查找了解。

    queue

学习来源:queuequeue1。队列,一种先进先出的数据结构,共有两个出口,可以从队头出元素队尾入元素,因此队列不允许遍历。

        头文件

#include <queue>

        构造queue对象

#include <queue>


queue<type> q1;

其中q1为队列名字,type为队列中元素的类型,可以是常见类型,也可以自己定义。

        成员函数

#include <queue>


queue<int> q1;


q1.back();     //返回队列最后一个元素
q1.empty();    //判断队列是否为空
q1.front();    //返回队列第一个元素
q1.pop();      //删除队列的第一个元素
q1.push();     //在队尾加入一个元素
q1.size();     //返回队列大小

    set

有序集合,关联容器的一种,基于红黑树实现,对于元素的查找、删除、插入时间复杂度都是O(log n)。其中元素不可重复,具有唯一性。学习来源:set

        头文件

#include <set>

        构造set对象

#include <set>


set<type> set1;

        成员函数

#include <set>


set<int> set1;
set<int> set2;


set1.insert(1);   //向set1中放入元素1
set1.erase(1);    //删除set1中的元素1
set1.empty();     //判断集合是否为空
set1.size();      //返回set1的大小
set1.count(1);    //统计1在集合中出现次数,返回结果只能是1或0,1表示集合中存在
set1.swap(set2);  //将set1中元素与set2中的元素交换

    multiset

    map

    multimap

    算法

    迭代器

    未完待补充,要睡觉了......

    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值