【C++学习第15天】STL

一、种类

  1. vector:变长数组,倍增的思想。给数组申请空间所耗费的时间取决于申请次数,而不是申请空间的大小,即a[1]和a[10000]两个数组的申请时间是基本一致的。
  2. pair<int, string>:存储一个二元组,前后两个变量类型任意。也可以存储多个类型,如pair<int, pair<int, string>>。
  3. string:字符串。操作:substr(), c_str()
  4. queue:队列。操作:push(), front(), pop()
  5. priority_queue:优先队列。操作:push(), top(), pop()
  6. stack:栈。操作:push(), top(), pop()
  7. deque:双端队列。
  8. set, map, multiset, multimap:基于平衡二叉树(红黑树),动态维护有序序列。
  9. unordered_set, unordered_map, unordered_multiset, unordered_multimap:哈希表。
  10. bitset:压位。

二、具体操作

  • 所有STL中的对象均具备:
cpp 复制代码
a.size()
a.empty()
  • vector:
cpp 复制代码
size()           // 返回元素个数
empty()          // 返回是否为空
clear()          // 清空
front()          // 返回数组的第一个数
back()           // 返回数组的最后一个数
push_back()      // 在数组的末尾插入一个数
pop_back()       // 弹出数组末尾的最后一个数
begin()          // vector的第0个数
end()            // vector最后一个数的后一位数
支持比较运算,如vector<int> a(4, 3), b(3, 4);其中, a < b。
当比较两个vector对象时,实际上是在比较它们的字典序。
vector容器的比较操作符按照元素的顺序进行比较。
它首先比较第一个元素,如果它们相等,则比较第二个元素,以此类推。
  • pair:
cpp 复制代码
first()         // 返回第一个元素
second()        // 返回第二个元素
支持比较运算,以first为第一个关键字,second为第二个关键字,按字典序。
  • string
cpp 复制代码
size()        
empty()
clear()
substr(a, b)        // 返回子串,a表示子串下标,b表示长度;
c_str()             
/*c_str()是C++中的一个字符串成员函数,用于返回一个指向以空字符结尾的字符数组(C风格字符串)的指针。
在C++中,字符串常常使用std::string类来表示。
c_str()函数允许我们将std::string对象转换为C风格字符串的形式,即以const char*的形式表示。*/
  • queue:
cpp 复制代码
size()
empty()
push()            // 向队尾插入一个元素
front()           // 返回队头元素
back()            // 返回队尾元素
pop()             // 弹出队头元素
q = queue<int>()  // 清空queue

值得注意的是,queue没有clear()操作。

  • priority_queue:
cpp 复制代码
push()    // 插入一个元素
top()     // 返回堆顶元素
pop()     // 弹出堆顶元素

默认是大根堆,小根堆定义如下:

cpp 复制代码
priority_queue<int, vector<int>, great<int>> heap;
  • stack:
cpp 复制代码
size()
empty()
push()        // 向栈顶插入一个元素
top()         // 返回栈顶元素
pop()         // 弹出栈顶元素
  • deque(效率较低,用的较少):
cpp 复制代码
size()
empty()
clear()
front()        // 返回第一个元素
back()         // 返回最后一个元素
push_back()    // 在末尾插入一个元素
pop_back()     // 弹出末尾一个元素
push_front()   // 在队首插入一个元素
pop_front()    // 弹出队首一个元素
begin()
end()
  • set(不能有重复元素 )/ multiset(可以有重复元素):
cpp 复制代码
size()
empty()
clear()
begin()    // 可++,--
end()

insert()
find()
count()        // 返回某一个数的个数
erase()
    (1) 输入一个数x,删除所有x,时间复杂度:O(k + logn);
    (2) 输入一个迭代器,删除这个迭代器.
lower_bound(x)    // 返回大于等于x的最小数的迭代器
upper_bound(x)    // 返回大于x的最小数的迭代器
[]              // 时间复杂度是 O(logn)
  • map / multimap
cpp 复制代码
size()
empty()
clear()
begin()
end()

insert()        // 插入的数是一个pair
erase()         // 输入的参数是pair或者迭代器
find()
[]              // 时间复杂度是 O(logn)
lower_bound()
upper_bound()
  • unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表

和上面类似,增删改查的时间复杂度是 O(1),而除此之外上面的增删改查的时间复杂度是 O(logn),但支持和排序有关的操作。

不支持 lower_bound() / upper_bound()、迭代器的++和--

  • bitset(压位):
cpp 复制代码
bitset<10000> s;
~ & | ^
>>, <<
==, !=
[]

count()    // 返回有多少个1
any()      // 判断是否至少有一个1
none()     // 判断是否全为0
set()      // 把所有位置变成1
reset()    // 把所有位置变成0
flip()     // 等价于~
flip(k)    // 把第k位取反
相关推荐
Bechamz20 小时前
大数据开发学习Day28
大数据·学习
孬甭_20 小时前
预处理详解
c语言·开发语言
m0_6146190620 小时前
独立开发者 0 元启动包:网站、数据库、部署全搞定
笔记·学习
CSCN新手听安21 小时前
【Qt】系统相关(二)鼠标事件的处理,鼠标的按下,释放,双击,移动,滚轮滚动事件的处理
开发语言·c++·qt
承渊政道21 小时前
【动态规划算法】(一文讲透二维费用的背包问题)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
yqcoder21 小时前
JavaScript 深拷贝:如何彻底切断引用关联?
开发语言·前端·javascript
知识分享小能手21 小时前
R语言入门学习教程,从入门到精通,初识R语言(1)
开发语言·学习·r语言
2301_8152795221 小时前
鸿蒙原生开发的“硬核通道”:ArkTS 与 C/C++ 高性能互操作全栈指南 —— FFI 机制深度解析与实战精要
c语言·c++·harmonyos
代码羊羊1 天前
Rust 迭代器完全通俗易懂指南(零基础全覆盖)
java·开发语言·rust
MY_TEUCK1 天前
【Java 后端】SpringBoot 登录认证与会话跟踪实战(JWT + Filter/Interceptor)
java·开发语言·spring boot