首页 > 编程语言 >C++ STL

C++ STL

时间:2023-02-25 22:46:23浏览次数:39  
标签:返回 set 迭代 STL 元素 C++ 为空 基本操作

C++ STL

C++ STL 是 C++ 自带的函数库,做题时充分利用这些函数,能节省大量时间。

vector

可变长数组,倍增的思想。

具体来说,一个 vector 数组一开始长度不大,每当元素装满数组, vector 便向系统申请两倍于原空间的空间,然后将原来的数据全移到新空间上。

vector 没有一个个申请空间,是因为在 C++ 中,申请空间的速度与空间的大小无关,而是与申请次数挂钩。

定义

vector<int> v;

基本操作

  1. v[x] 支持随机寻址。
  2. v.size() 返回元素个数。
  3. v.empty() 返回是否为空。
  4. v.clear() 清空数组。
  5. v.push_back()pop_back() 分别表示在尾部添加和删除元素。
  6. v.begin()v.end() 分别返回头部迭代器和尾部迭代器。

支持比较运算,按字典序。

pair

存储成对的元素,用于排序的话排序后还能找到每个元素原来的下标。

定义

pair<int,int> p;

基本操作

  1. p.first 第一个元素。
  2. p.second 第二个元素。

支持比较运算,按字典序(以first为第一关键字,以second为第二关键字)。

string

字符串。

定义

string s;

基本操作

  1. s.size() / s.length() 返回字符串长度。
  2. s.empty() 返回字符串是否为空。
  3. s.clear() 清空字符串。
  4. s.substr(【起始下标】,【子串长度】) 返回子串。
  5. s.c_str() 返回字符串所在字符数组的起始迭代器。

queue,

队列,先进先出表。

定义

queue<int> q;

基本操作

  1. q.size() 返回元素个数。
  2. q.empty() 返回队列是否为空。
  3. q.push() 向队尾插入一个元素。
  4. q.front() 返回队头元素。
  5. q.back() 返回队尾元素。
  6. q.pop() 弹出队头元素。

priority_queue

优先队列,相当于一个二叉堆,维护极值在堆顶。

默认是大根堆。

定义

priority_queue<int> q;

基本操作

  1. q.size() 返回元素个数。
  2. q.empty() 返回队列是否为空。
  3. q.push() 插入一个元素。
  4. q.top() 返回堆顶元素。
  5. q.pop() 弹出堆顶元素。

定义成小根堆的方式:

priority_queue<int,vector<int>,greater<int> > q;

至于为什么会变成小根堆,读者有兴趣可以查资料,这里不多叙述。

stack

栈,先进后出表。

定义

stack<int> s;

基本操作

  1. s.size() 返回元素个数。
  2. s.empty() 返回栈是否为空。
  3. s.push() 向栈顶插入一个元素。
  4. s.top() 返回栈顶元素。
  5. s.pop() 弹出栈顶元素。

注意, C++ 中给栈分配的空间有限,数据大时可能会溢出,俗称“爆栈”,要慎用。

deque

双端队列,几乎有上文函数的所有操作。

定义

deque<int> d;

基本操作

  1. d.size() 返回元素个数。
  2. d.empty() 返回双端队列是否为空。
  3. d.clear() 清空双端队列。
  4. d.front() 返回队头。
  5. d.back() 返回队尾。
  6. d.push_back() 在队尾添加元素。
  7. d.pop_back() 在队尾删除元素。
  8. d.push_front() 在队头添加元素。
  9. d.pop_front() 在队头删除元素。
  10. d.begin() 返回队头迭代器。
  11. d.end() 返回队尾迭代器。
  12. d[x] 支持随机寻址。

set 和 map

都基于平衡树(红黑树),动态维护有序序列。

这两个函数内部差不多,用法也差不多

时间复杂度 \(\operatorname{O(logn)}\)

set 和 multiset

有序集合, set 自动去重, multiset 不去重,用法相同。

定义

set<int> s;
multiset<int> ms;

基本操作

  1. s.size() 返回集合元素个数。
  2. s.empty() 返回集合是否为空
  3. s.clear() 清空集合。
  4. s.begin() 返回集合头部迭代器。
  5. end() 返回集合尾部迭代器。
  6. ++, -- 返回前驱和后继。
  7. s.insert(x) 插入一个数。
  8. s.find(x) 查找一个数。
  9. s.count(x) 返回某一个数的个数。
  10. s.erase(x) 分两种情况:
    • 输入是一个数 \(x\) ,删除所有 \(x\) 。
    • 输入一个迭代器,删除这个迭代器。
  11. s.lower_bound(x) 返回大于等于x的最小的数的迭代器。
  12. s.upper_bound(x) 返回大于x的最小的数的迭代器。

map 和 multimap

映射器,可以将映射前类型 key(包括 STL 容器的任何基本类型)映射到映射后类型 value (包括 STL 容器的任何基本类型)。
和 set 一样, map 分去重和非去重型,分别为 map 和 multimap 。

定义

map<int,int> m;
multimap<int,int> mm;

基本用法

  1. m.size() 返回映射器元素个数。
  2. m.empty() 返回映射器是否为空
  3. m.clear() 清空映射器。
  4. m.begin() 返回映射器头部迭代器。
  5. m.end() 返回映射器尾部迭代器。
  6. ++, -- 返回前驱和后继。
  7. m.insert({x,y}) 插入一个 pair 。
  8. m.erase({x,y}) 输入一个 pair 或迭代器。
  9. m.find(x) 查找一个元素。
  10. m[x] 支持随机寻址,不过 multimap 不支持此操作。
  11. lower_bound() 返回大于等于x的最小的数的迭代器。
  12. upper_bound() 返回大于x的最小的数的迭代器。

unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表
和上面类似,增删改查的时间复杂度是 O(1)
不支持 lower_bound()/upper_bound(), 迭代器的++,--

bitset, 圧位
bitset<10000> s;
~, &, |, ^
>>, <<
==, !=
[]

count()  返回有多少个1

any()  判断是否至少有一个1
none()  判断是否全为0

set()  把所有位置成1
set(k, v)  将第k位变成v
reset()  把所有位变成0
flip()  等价于~
flip(k) 把第k位取反

标签:返回,set,迭代,STL,元素,C++,为空,基本操作
From: https://www.cnblogs.com/wangxuzhou-blog/p/17155619.html

相关文章

  • 【C++小程序】《我要抽签》b1.0做好了~
    也许是的,得横空出世了如你所见这款基于\(C++\)能模仿Mrs.Yao抽签系统的cpp终于做完了啦~初期功能很少。\(BUG\)极多。所以为了您的体验:)请遵守格式代码:#includ......
  • C/C++停车场管理系统[2023-02-25]
    C/C++停车场管理系统[2023-02-25]选题九:停车场管理系统[问题描述]1)以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。2)每一组输入......
  • C++ 临时对象
    目录产生临时对象类型不匹配如何消除临时对象?消除循环体中的临时对象按值传递传参传返回值用operator=()消除临时对象总结参考临时对象对开发人员来说,可能是个意外情况,因......
  • C++函数名修饰规则
    C++函数名修饰规则这是啥函数的名字修饰(DecoratedName)就是编译器在编译期间创建的一个字符串。用来指明函数的定义或原型。修饰规则C++的修饰规则为“?+函数名+标......
  • ASP.NET中maxRequestLength和maxAllowedContentLength的区别;上传大文件设置IIS7文件上
    https://blog.csdn.net/qq_23663693/article/details/89920039maxRequestLength表示ASP支持的最大请求大小,而maxAllowedContentLength指定IIS支持的请求中内容的最大长度......
  • C++-4 数组
                   ......
  • 记录一下使用VScode运行C/C++程序
    三个文件:c_cpp_properties.json、launch.json、tasks.json1.c_cpp_properties.json的生成第一步:   第二步   则会生成   2.tasks.json  3.la......
  • C++实现分数四则运算
    #include<iostream>usingnamespacestd;//辗转相除法求最大公约数(12和18的最大公约数:6)intgcd(inta,intb){a=(a<0)?(a=-a):(a=a);b=(......
  • 自动洗牌机c++
    首先是字符数组与结构体的两个应用比较,牌组s1,s2,s3...,如果用字符数组是不能够把s1捆绑在一起的,观察发现牌组都是一个花色捆绑一个数字,可以联想到结构体。其次因为涉及交换,......
  • C++类的使用
    类内成员函数声明:返回类型函数名()类内成员函数定义:在类外定义;写法:返回类型类名::函数名类内成员函数调用:类名.函数名例子classBox{public:doublel......