STL常用容器介绍

3.STL常用容器

3.1 string容器

3.1.1 string基本概念

本质:

  • string是C++风格的字符串,而string本质上是一个类
    string和char*区别:
  • char*是一个指针
  • string是一个类,类内部封装了char*,管理这个字符串,是一个char型的容器。
    特点:
    string类内部封装了很多成员方法
    例如:查找find、拷贝copy,删除delete 替换replace,插入insert
    string管理char
    所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

3.1.2 string构造函数

构造函数原型:

  • string() //创建一个空的字符串 例如:string str;
    string(const char* s); //使用字符串初始化
  • string(const string& str); // 使用一个string对象初始化另一个string对象
  • string(int n,char c); //使用n个字符初始化

示例: 3.1-string容器-构造函数.cpp
总结: string的多种构造方式没有可比性,灵活使用即可

3.1.3 string赋值操作

功能描述:

  • 给string字符串进行赋值

赋值的函数原型:

  • string &operator=(const char s); // char类型字符串 赋值给当前的字符串
  • string &operator=(const string &s); //把字符串s赋值给当前的字符串
  • string &operator=(char c); //把字赋值给当前的字符串
  • string &assign()(const char *s); //把字符串s赋给当前的字符串
  • string &assign()(const char *s, int n); //把字符串s的前n个字符串赋值给当前的字符串
  • string &assign(const string &s); //把字符串s赋值给当前字符串
  • string &assign(int n, char c); //用n个字符c赋值给当前字符串

示例: 3.2-string容器-赋值操作.cpp
总结:
string的赋值方式很多,operator= 这种方式是比较实用的

3.1.4 string字符串拼接

功能描述

  • 实现在字符串末尾拼接字符串

函数原型:

  • string &operator+=(const char *str); // 重载+=操作符
  • string &operator+=(const char c); //重载+=操作符
  • string &operator+=(const string &str); //重载+=操作符
  • string &append()(const char *s); //把字符串s连接到当前字符串结尾
  • string &append()(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾
  • string &append(const string &s); //同operator+=(const string& str)
  • string &append(const string &s,int pos, int n); //字符串s中从pos开始的n个字符连接到字符串结尾

示例:3.3-string容器-字符串拼接.cpp
总结:
string的拼接的重载版本很多,初学阶段记住几种即可

3.1.5 string查找和替换

功能描述

  • 查找:查找指定字符串是否存在
  • 替换:在指定的位置替换字符串

函数原型:

  • int find(const string& str, int pos = 0)const; // 查找str第一次出现位置,从pos开始查找
  • int find(const char* s, int pos = 0)const; // 查找s第一次出现位置,从pos开始查找
  • int find(const char* s, int pos, int n)const; //从pos位置查找s的前n个字符第一次位置
  • int find(const char c, int pos = 0)const; // 查找字符c第一次出现位置
  • int rfind(const string& str, int pos = npos)const; //查找str最后一次位置,从pos开始查找
  • int rfind(const char* s, int pos = n)const; // 从pos开始s的前n个字符最后一个位置
  • int rfind(const char c, int pos = 0)const; // 查找字符c最后一次出现的位置
  • string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
  • string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s

示例: 3.4-string容器-字符串查找与替换.cpp
总结:

  • find查找是从左往后,rfind从右往左
  • find找到字符串后返回查找的第一个字符位置,找不到返回-1
  • replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串

3.1.6 string字符串比较

功能描述:

  • 字符串之间的比较
    比较方式:
  • 字符串比较是按字符的ASCII码进行对比
    =返回 0

返回 1
<返回 -1

函数原型:

  • int compare(const string& str)const; // 与字符串s比较
  • int compare(const char* s)const; // 与字符串s比较

示例:3.5-string容器-字符串拼接.cpp
总结: 字符串对比主要是用于比较两个字符串是否相等,判断谁大谁小的意义并不是很大

3.1.7 string字符存取

string中单个字符存取方式有两种

  • char& operator[] (int n); // 通过[]方式取字符
  • char& at(int n); // 通过at方法获取字符

函数原型:

  • int compare(const string& str)const; // 与字符串s比较
  • int compare(const char* s)const; // 与字符串s比较

示例: 3.6-string容器-字符串存取.cpp
总结: string字符串中单个字符存取有两种方式,利用[]或at

3.1.8 string插入和删除

功能描述:

  • 对string字符串进行插入和删除字符 操作

函数原型:

  • string& insert(int pos,const char* s); // 插入字符串
  • string& insert(int pos,const string& str); // 插入字符串
  • string& insert(int pos,int n, char c); // 在指定位置插入n个字符c
  • string& earese(int pos,int n = npos); // 删除从Pos开始的n个字符

示例:3.7-string容器-插入和删除.cpp
总结: 插入和删除的起始下标都是从0开始

3.1.9 string子串

功能描述:

  • 从字符串中获取想要的子串

函数原型:

  • string& substr(int pos = 0,int n = npos); const // 返回由pos开始的n个字符组成的字符串

示例: 3.8-string容器-子串.cpp
总结: 灵活的运用求子串功能,可以在实际开发中获取有效的信息

3.2 vector容器

3.2.1 vector基本概念

功能:

  • vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:

  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在原有空间之后续接新空间,二十找更大的内存空间和,然后将源数据拷贝新空间,释放原空间

3.2.2 vector构造函数

功能描述:

  • 创建vector容器

函数原型:

  • vector v; //采用模板实现类实现,默认构造函数
  • vector(v.begin(), v.end()); //将v[begin(),end()]区间中的元素拷贝给本身
  • vector(m, elem); //构造函数将n个elem拷贝给本身
  • vector(const vector &vec) //拷贝构造函数
    示例:3.2.1-vector容器-构造函数.cpp
    总结:vector容器的迭代器是支持随机访问的迭代器

3.2.3 vector赋值操作

功能描述:

  • 给vector容器进行赋值

函数原型:

  • vector &operator=(const vector &vec); //重载等号操作符
  • assign(beg, end); //将v[beg,end]区间中的元素拷贝赋值给本
  • assign(n, elem); //将n个elem拷贝构造赋值给本身

示例:3.2.2-vector容器-赋值操作.cpp
总结:vector赋值方式比较简单,使用operator=,或者assign都可以

3.2.4 vector容量和大小

功能描述:

  • 对vector容器的容量和大小操作

函数原型:

  • empty(); //判断容器是否为空
  • capacity(); //容器的容量
  • size(); //返回容器中元素的个数
  • resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置,
    //如果容器变短,则末尾超出容器长度的元素被删除。
  • resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以emel值填充新位置
    //如果容器变短,则末尾超出容器长度的元素被删除

示例:3.2.3-vector容器-容量和大小.cpp
总结:

  • 判断是否为空 — empty
  • 返回元素个数 — size
  • 返回容器容量 — capacity
  • 重新指定大小 — resize

3.2.5 vector插入和删除

功能描述:

  • 对vector容器进行插入、删除操作

函数原型:

  • push_back(ele); //尾部插入元素ele
  • pop_back(); //删除最后一个元素
  • insert(const_iterator pos, ele); //迭代器指向位置pos插入元素ele
  • insert(const_iterator pos, int count, ele); //迭代器指向位置pos插入count个元素ele
  • erase(const_iterator pos); //删除迭代器指向的元素
  • erase(const_iterator start, const_iterator end); // 删除迭代器从start到end之间的元素
  • clear(); //删除容器中所有元素

示例:3.2.4-vector容器-插入和删除.cpp
总结:

  • 尾插 — push_back
  • 尾插 — pop_back
  • 插入 — insert(位置迭代器)
  • 删除 — erase(位置迭代器)
  • 清空 — clear

3.2.6 vector数据存取

功能描述:

  • 对vector中的数据的存取操作

函数原型:

  • at(int idx); //返回索引idx所指的数据
  • operator[]; //返回索引idx所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

示例:3.2.5-vector容器-vector数据存取.cpp
总结:

  • 除了用迭代器取vector容器中元素,[]和at也可以
  • front返回容器中第一个元素
  • back返回容器最后一个元素

3.2.7 vector互换容器

功能描述:

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec); //将vec与本身的元素互换

示例:3.2.6-vector容器-互换容器.cpp
总结: swap可以使两个容器互换,可以达到实用的收缩内存效果

3.2.8 vector预留空间

功能描述:

  • 减少vector在动态扩展容量时的扩展次数

函数原型:

  • reserve(int len); //容器预留len个元素长度,预留位置不初始化,元素不可访问。

示例:3.2.7-vector容器-预留空间.cpp
总结: 如果数据量较大,可以一开始利用reserve预留空间

3.3 deque容器

3.3.1 deque容器基本概念

功能:

  • 双端数组,可以对头端进行插入删除操作

deque与vector区别:

  • vector对于头部的插入删除效率低,数据量越大,效率越低
  • deque相对而言,对头部的插入删除速度会比vector快
  • vector访问元素时的速度会比deque快,这和两者内部实现有关
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QqtoN8Ku-1651803962899)(https://github.com/codexuhy/c_plus_plus_learning/blob/main/images/1.jpg#pic_center)]

deque内部工作原理:
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iyXp4nWW-1651803962900)(https://github.com/codexuhy/c_plus_plus_learning/blob/main/images/2.jpg#pic_center)]

  • deque容器的迭代器也是支持随机访问的

3.3.2 deque构造函数

功能描述:

  • dequr容器构造

函数原型:

  • deque deqT; //默认构造形式
  • deque(beg, end); //构造函数将[beg,end)区间中的元素拷贝给本身
  • deque(n, elem); //构造函数将n个elem拷贝给本身
  • deque(const deque &deq); //拷贝构造函数

示例: 3.3.1-deque容器-构造函数.cpp
总结: deque容器和vector容器的构造方式几乎一致,灵活使用即可

3.3.3 deque赋值操作

功能描述:

  • 给dequr容器进行赋值

函数原型:

  • deque &operator=(const deque &deq); //重载等操作符
  • assigh(beg, end); //将[beg,end)区间中的数据拷贝赋值给本身
  • assign(n, elem); //将n个elem拷贝赋值给本身

示例: 3.3.2-deque容器-赋值操作.cpp
总结: deque容器复制操作和vector相同,需熟练掌握

3.3.4 deque大小操作

功能描述:

  • 对deque容器的大小进行操作

函数原型:

  • deque.empty(); //判断容器是否为空
  • deque.size(); //返回容器中元素的个数
  • deque.resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置,
    //如果容器变短,则末尾超出容器长度的元素被删除。
  • deque.resize(int num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置
    //如果容器变短,则末尾超出容器长度的元素被删除

示例: 3.3.3-deque容器-大小操作.cpp
总结:

  • deque容器没有capacity概念
  • 判断是否为空 — empty
  • 返回元素个数 — size
  • 重新指定个数 — resize

3.3.5 deque插入和删除

功能描述:

  • 向deque容器中插入和删除数据

函数原型:
两端插入操作:

  • deque.push_back(elem); //在容器尾部添加一个数据
  • deque.push_front(elem); //在容器头部插入一个数据
  • deque.pop_back(); //删除容器最后一个数据
  • deque.pop_front(); //删除容器第一个数据
    指定位置操作:
  • insert(pos, elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
  • insert(pos, n, elem) //在pos位置插入n个elem数据,无返回值
  • insert(pos, beg, end); //在pos位置插入[beg,end)区间的数据,无fanhu值
  • clear(); //清空容器的所有数据
  • erase(beg, end); //删除[beg,end)区间的数据,返回下一个数据的位置
  • erase(pos); //删除pos位置的数据,返回下一个数据的位置

示例: 3.3.4-deque容器-插入和删除.cpp
总结:

  • 插入和删除提供的位置是迭代器!
  • 尾插 — push_back
  • 尾删 — pop_back
  • 头插 — push_front
  • 头删 — pop_front

3.3.6 deque数据存取

功能描述:

  • 对deque中数据的存取操作

函数原型:

  • deque.push_back(elem); //在容器尾部添加一个数据
  • deque.push_front(elem); //在容器头部插入一个数据
  • deque.pop_back(); //删除容器最后一个数据

示例: 3.3.5-deque容器-数据存取.cpp
总结:

  • 除了用迭代器获取deque容器中元素,[]和at也可以
  • front返回容器第一个元素
  • back返回容器最后一个元素

3.3.7 deque排序

功能描述:

  • 利用算法实现对deque容器进行排序

算法:

  • sort(iterator bag,iterator end); // 对beg和end区间内元素进行排序

示例: 3.3.6-deque容器-排序.cpp
总结: sorted算法比较实用,使用时包含头文件algorithm即可

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值