算法乐园 主页 笔记 刷题




C++ STL总结

2023.6.8

参考文献:

  1. C++_vector操作(vector容器部分参考了)
  2. B站,黑马程序员C++教学视频

1.vector容器

需要头文件#include<vector>

(1)构造

(2)基本操作

(3)反向迭代

(4)插入

  
插入位置都在pos迭代器之前一个位置,返回的迭代器指向插入的第一个元素 
在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。iterator insert(pos, elem)
在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。iterator insert(pos, n, elem)
在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于[first, last)区域的所有元素,并返回表示第一个新插入元素位置的迭代器。iterator insert(pos, first, last)
在迭代器 pos 指定的位置之前,插入初始化列表(用大括号{}括起来的多个元素,中间有逗号隔开)中所有的元素,并返回表示第一个新插入元素位置的迭代器。iterator insert(pos, initlist)

(5)

pop_back()删除 vector 容器中最后一个元素,该容器的大小(size)会减 1, 但容量(capacity)不会发生改变。
erase(pos)删除vector容器中pos迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器
该容器的大小(size)会减1,但容量(capacity)不会发生改变。
???swap(beg)、 pop_back()先调用 swap() 函数交换要删除的目标元素和容器最后一个元素的位置,
然后使用 pop_back) 删除该目标元素。
erase(beg,end)删除vector容器中位于迭代器[beg,end)指定区域内的所有元素,并返回指向被删除区域下一个
位置元素的迭代器。该容器的大小(size)会减小,但容量(capacity)不会发生改变。
remove()删除容器中所有和指定元素值相等的元素,并返回指向最后一个元素下一个位置的迭代器。
值得一提的是,调用该函数不会改变容器的大小和容量。
clear()删除 vector 容器中所有的元素,使其变成空的 vector 容器。
该函数会改变 vector 的大小(变为 0) ,但不是改变其容量。

2.deque 容器

需要头文件#include<deque>

(1)遍历容器

(2)构造容器

程序输出:

(3)赋值操作

程序输出:

(4) 插入和删除

(5)数据存取

3.stack 容器

需要头文件#include<stack>

4.queue容器

需要头文件#include<queue>

5.string容器

(1)构造

(2)赋值

(3)拼接

(4)查找和替换

(5)字符串比较

(6)字符存取

(7)插入和删除

(8)子串

(9)string容器其他

  1. string s; // 生成一个空字符串s
  2. string s(str); // 拷贝构造函数生成str的复制品
  3. string s(str, stridx); // 将字符串str内"始于位置stridx"的部分当作字符串的初值
  4. string s(str, stridx, strlen); // 将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值
  5. string s(cstr); // 将C字符串(以NULL结束)作为s的初值
  6. string s(chars, chars_len); // 将C字符串前chars_len个字符作为字符串s的初值。
  7. string s(num, ‘c’); // 生成一个字符串,包含num个c字符
  8. string s(“value”); string s = “value”; // 将s初始化为一个字符串字面值副本
  9. string s(begin, end); // 以区间begin/end(不包含end)内的字符作为字符串s的初值
  10. s.~string(); //销毁所有字符,释放内存

 

string s;

  1. s.empty(); // s为空串 返回true
  2. s.size(); // 返回s中字符个数 类型应为:string::size_type
  3. s[n]; // 从0开始相当于下标访问
  4. s1+s2; // 把s1和s2连接成新串 返回新串
  5. s1=s2; // 把s1替换为s2的副本
  6. v1==v2; // 比较,相等返回true
  7. !=, <, <=, >, >= 惯有操作 任何一个大写字母都小于任意的小写字母

6.set容器和multiset容器

需要头文件#include<set>

set不允许容器中有重复的元素

multiset允许容器中有重复的元素

其他操作基本一致

(1)遍历容器

(2)插入和删除

程序输出:

(3)查找和统计

程序输出:

(4)set与multiset

程序输出:

程序输出:

7.map和multimap容器

需要头文件#include<map>

map中所有元素都是pair

pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)

所有元素都会根据元素键值自动排序

map/multimap属于关联式容器,底层结构是用二叉树实现

优点:可以根据key值快速找到value值

map和multimap区别:

map不允许容器中有重复key值元素

multimap允许容器中有重复key值元素

(1)遍历

程序输出:

(2)大小和交换

(3)插入和删除

程序输出:

(4)查找与统计

8.STL常用算法

以下除特别说明,都需要#include<algorithm>头文件

(1)for_each和transform

find查找元素
find_if按条件查找元素
adjacent_find查找相邻重复元素
binary_search二分查找法
count统计元素个数
count_if按条件统计元素个数

(2)find

功能描述:.查找指定元素, 找到返回指定元素的选代器, 找不到返回结束选代器end()

函数原型 :

find(iterator beg, iterator end, value);

按值查找元素,找到返回指定位置选代器,找不到返回结束选代器位置

beg 开始迭代器

end结束迭代器

value查找的元素

(3)find_if

功能描述:

按条件查找元素

函数原型:.find_if(iterator beg, iterator end, _Pred);

按值查找元素,找到返回指定位置选代器,找不到返回结束选代器位置

beg开始迭代器

end结束迭代器

_Pred函数或者谓词(返回bool类型的仿函数)

(4)binary_search

查找指定的元素,查到返回true,否则返回false

注意:在无序序列中不可用,因为结果会出错

降序也不行,只能用于升序序列

(5)adjacent_find

查找相邻重复元素,返回相邻元素的第一个位置的迭代器

少用,但是考试会考

(6)count

统计元素个数

(7)count_if

程序输出:

(8)sort排序算法

程序输出:

(9)random_shuffle

(10)merge

可以把两个有序序列合在一起,形成一个新的有序序列

程序输出:

(11)reverse

逆序

程序输出:

(12)copy将容器内指定范围的元素拷贝到另一容器中

注意:新容器需要预留空间

程序输出:

13.replace和replace_if

replace将容器内指定范围的旧元素修改为新元素

replace_if将区间内满足条件替换成指定元素

程序输出:

(14)swap

交换

程序输出:

(15)accumulate和fill

需要头文件#include<numeric>

accumulate计算容器元素累计总和

fill向容器中添加元素

程序输出:

(16)交集,并集,差集

set_intersection求两个容器的交集

set_union并集

set_difference差集

程序输出:

(17)next_permutation

全排列

程序输出:

(18)lower_bound和upper_bound

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。

在从小到大的排序数组中,lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

也可以用于vector容器,返回值是迭代器