【C++】STL

1.stack(栈)

先进后出的数据结构。

栈只允许访问栈顶元素,不允许随机访问和遍历。

常用接口:
0. 头文件
#include <stack>

  1. 构造函数

    • stack stk;
    • stack stk2(stk1);
  2. 赋值操作

    • (stack) stk2 = (stack) stk1;
  3. 数据存取

    • push(T data) : 入栈
    • pop() : 出(弹)栈
    • top() : 返回栈顶元素
  4. 获取属性

    • empty() : 判断是否为空,为空返回true
    • size() : 返回栈的大小

2.queue(队列)

先进先出的数据结构。

队列只允许访问队头数据和队尾元素,存数据只能是队尾。

不允许随机访问和遍历。

常用接口:
0. 头文件
#include <queue>

  1. 构造函数

    • queue que;
    • queue que2(que1);
  2. 赋值操作

    • (queue) que2 = (queue) que1;
  3. 数据存取

    • push(T data) : 入队(尾)
    • pop() : 出队(头)
    • back() : 返回最后一个元素
    • front() : 返回队头元素
  4. 获取属性

    • empty();
    • size();

3.list(链表)

将数据链式存储的一种数据结构。

一个数据结点由一个数据域和指针域构成。

单向链表:(一个)数据域用来存储数据,(一个)指针域用来存储下一结点的数据域地址。

优点:

  • 对任一位置数据进行快速的插入,删除。
  • 利用了较为零散的空间
    缺点:
  • 查找,遍历时较为费时
  • 无法回溯访问
  • 较为占用空间

针对第二个缺点,定义双向链表:(一个)数据域用来存储数据,(两个个)其中,一个指针域用来存储下一结点的数据域地址,另外一个指针域指向上一结点的数据域。

常用接口:
0. 头文件:
#include <list>

  1. 构造函数:

    • list list1;
    • list list2(list::iterator it1, list::iterator it2);
    • list list1(int n, T data);
    • list list2(list1);
  2. 赋值和交换:

    • (list) list2.assign(list::iterator it1, list::iterator it2);
    • (list) list1.assign(int n, T data);
    • (list) list2 = (list) list1;
    • (list) list2.swap((list) list1);
  3. 获取属性:

    • list.size();
    • list.empty();
    • list.resize(int num);
    • list.resize(int num, T data);
  4. 插入和删除:

    • list.push_back(T data);
    • list.push_front(T data);
    • list.pop_back();
    • list.pop_front();
    • list.insert(iterator pos, T data) : 在位置pos处插入数据data
    • list.insert(iterator pos, int n, T data) : 在位置pos处插入n个数据data
    • list.insert(iterator pos, iterator it1, iterator it2);
    • list.clear();
    • list.erase(iterator it1, iterator it2) : 删除区间内所有数据,返回下一结点数据域地址
    • list.pos(iterator pos) : 删除pos结点的数据,返回下一结点数据域地址
    • list.remove(T data) : 移除链表中所有的data
  5. 数据的存取:

    • list.front() : 返回第一个元素
    • list.back() : 返回最后一个元素
  6. 链表反转:

    • list.reverse() : 链表反转
    • list.sort() : 链表升序排序
      注意:
      • 标准算法头文件中的算法只适用于支持随机访问的容器,调用时,使用函数的调用形式
      • 对于不支持随机访问的容器,其内部实现了部分算法,使用时,使用方法的调用形式

4.set&multiset(集合)

在插入数据时自动排序,默认升序排列,想改变排序方法可以使用仿函数实现。

关联式容器,底层数据结构使用二叉树实现。

set不允许数据重复出现,multiset允许。

常用接口:
0. 头文件

  1. 构造和初始化:

    • set s1;
    • set s2(s1);
    • (set) s2 = (set s1);
  2. 获取属性:

    • set.size();
    • set.empty();
  3. 交换数据:

    • set1.swap(set2);
  4. 插入和删除:

    • set.insert(T data);
    • set.clear();
    • set.erase(iterator pos);
    • set.erase(iterator it1, iterator it2);
    • set.erase(T data) : 删除所有匹配项
  5. 查找和统计:

    • set.find(T data) : 从容器中查找数据data,找到返回迭代器位置,未找到返回end()
    • set.count(T data) : 统计set中data的个数

值得注意的是,set容器对于自定义的数据类型无法进行直接排序,需要通过仿函数对排序规则进行指定。

class myCompare
{
public:
   bool operator()(class_name c1, class_name c2)const
   {
      // 排序规则
   }
};

5.pari(对组or元组)

成对出现的数据可以使用元组来存储。

底层使用结构体实现。

使用不需要刻意引入头文件。

常用接口:

  1. 定义方式:

    • pari<T1, T2> p(T1 data1, T2 data2);
    • pari<T1, T2> p = make_pari((T1)data1, (T2)data2);
  2. 数据访问:

    • pari.first : 访问第一个数据
    • pari.second : 访问第二个数据

6.map&multimap(字典)

map中所有的元素均为pari,first为关键字key,也称索引值,键值,second为实值value。且所有元素在插入时根据key自动排序(默认升序)。

map也属于关联式容器,底层数据结构为二叉树。

索引不可以重复,但是值可以。

常用方法:
0. 头文件

  • #include <map>
  1. 构造和赋值:

    • map<T1, T2> mp;
    • map<T1, T2> mp2(mp1);
    • mp1 = mp2;
  2. 属性的获取:

    • map.size();
    • map.empty();
    • map1.swap(map2);
  3. 插入和删除:

    • map.insert(pari<T1, T2> (key, value));
    • map.insert(make_pari((T1)key, (T2)value));
    • map.insert(map<T1, T2>::valve_type(key, value));
    • map[key] = vlaue; // 这种方式不建议在访问数据元素使用,避免覆盖原值,或者生成一个不存在的键值对。
    • map.clear();
    • map.erase(iterator pos);
    • map.erase(iterator it1, iterator it2);
    • map.erase((T1) key) : 删除索引值为key的键值对,对于multimap而言,则会删除所有匹配项

值得注意的是:

  • map在使用insert插入相同key的pari时,先插入的可以保存,后插入的无法保存。
  • 利用 map[key] = value插入数据时,则会覆盖原来的数据
  • 所以应当根据自己的需求,合理的选择插入方法
  1. 查找和统计:

    • map.find(key) : 查找key的位置,存在返回迭代器位置,不存在返回map.end()
    • map.count(key);
  2. 排序:
    类似于set容器,内置数据类型直接进行排序,自定义数据类型通过仿函数指定排序规则进行排序。

7.实战案例-招聘新员工

招聘新员工.cpp

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值