1.vector

动态数组,方便的动态扩容,方便的变量初始化(int类型默认初始化为0,bool默认初始化为false),可以用来实现邻接表(结点数太多的图)。

头文件

#include<vector>
using namespace std;

定义

//typename 可以是基本数据类型,可以是其它标准stl容器,可以是自定义结构体
vector<typename> name;
vector<int> v1;
vector<vector<int> > v2; //两个维度都是动态的
vector<student> v3(10);//一维固定为10,二维动态

元素访问

//1.下标访问
v[i]
//2.迭代器访问
vector<typename>::iterator it;
auto it;//另一种迭代器简易定义方法
for(auto it = v.begin();it!=v.end();it++)
cout<<*it;
//迭代器it可以进行算术运算

常用函数

函数 说明
push_back(x); 将元素x添加到容器末尾
pop_back(); 删除容器末尾元素
size(); 获取容器大小
clear(); 清空元素
insert(it,x); 在it处插入一个元素x
erase(it); 删除it处的元素
erase(first,last); 删除[first,last)区间内的元素

使用场景

  • 元素个数不确定
  • 用于实现邻接表存储图

2.set

内部自动有序且不含重复元素的集合。

头文件

#include<set>
using namespace std;

定义

set<typename> name;

元素访问

for(auto it = v.begin();it!=v.end();it++)
cout<<*it;

常用函数

函数 说明
insert(x); 将元素x插入set容器中,并自动递增排序和去重
find(value); 查找值为value的元素,返回对应迭代器
erase(it); 删除it处的元素,通常结合find函数使用
erase(value); 删除值为value的元素
erase(first,last); 删除[first,last)区间内的元素
size(); 返回容器大小
clear(); 清空容器

使用场景:

  • 自动去重并按升序排序

扩展:

  • 需要元素不唯一,使用multiset

  • 需要元素不排序,unordered_set(內部以散列代替了set内部的红黑树),速度比set快得多

3.string

字符串,可以替换为C语言版的字符数组(str.c_str();)。

头文件

#include<string>
using namespace std;

定义

string str;

内容访问

//1.下标访问
str[i] //2.输入输出只能用cin和cout,除非转化为字符数组 //3.迭代器访问

常用函数

函数 说明
operator+= 字符串拼接
compare operator 按照字典序比较大小
length()/size() 获取字符串大小
insert(pos,str); pos是int类型,表示在指定位置插入str
insert(it,first,last); 在it处插入[first,last)范围内的字符串
erase(it); 删除it处的元素
erase(first,last); 删除[first,last)范围内的元素
erase(pos,length); 删除pos位置开始的length个字符
clear(); 清空字符串
substr(pos,len); 返回从pos位置开始len长度的字符串
string::npos 作为find函数未找到的判断依据
find(str); 返回str第一次出现的位置
replace(pos,len,str2); 从pos位置开始,长度为len的子串替换为str2

4.map

将任何基本类型映射到任何基本类型(包括STL容器)。

可以用于hash散列(当元素个数比较多时,不适合用数组散列,就用map)

头文件及定义

#include<map>
using namespace std;
map<typename1,typename2> mp;

元素访问

//1.下标
mp['c']
mp[0]
mp["key"] //2.迭代器
for(auto it = mp.begin(); it != mp.end(); it++){
cout<< it->first<<" "<<it->second;
}

常用函数

函数 说明
find(key); 返回键为key的映射的迭代器
erase(it); 删除it处的元素
erase(key); 删除key
erase(first,last); 删除[first,last)区间内的元素
size(); 返回容器大小
clear(); 清空容器

使用场景:

  • 散列表
  • 其他映射

扩展:

  • 多映射,即一个key对应多个value,使用multimap
  • unordered_map可以替代map,内部实现使用散列代替了map内部的红黑树实现,用于处理只映射而不需要按key来排序的需求,速度快

5.queue

队列,先进先出的容器,常用于广度优先搜索

头文件及定义

#include<queue>
using namespace std; queue<typename> name;

常用函数

函数 说明
push(x); 元素x入队列
front(); 访问队列的首元素
back(); 访问队列的尾元素
pop(); 队首元素出队
empty(); 检测是否为空队列
size(); 队列大小

使用场景

  • 广度优先搜索

另外,需要注意使用front(),back(), pop()函数前,必须判断是否为空队列(使用empty函数)

扩展

  • deque(double end queue,双端队列)首位皆可插入和删除
  • priority_queue,使用堆实现的默认将当前队列最大元素置于队首的容器

6.priority_queue

优先队列,默认情况下是将队列中最大元素置于队首,优先级可以自定义。每次进行push(),pop()操作,底层的数据结构堆(heap)都会随时调整结构,使优先级最高的元素永远都在队首。

头文件及定义

#include<queue>
using namespace std;
priority_queue<typename> name;

常用函数

函数 说明
push(x); 将元素x入队
top(); 访问队首元素
pop(); 将队首元素出队
empty(); 检测是否为空队列
size(); 返回队列大小

优先级设定

基本数据类型(int,double,char)默认数字大或者字典序大的优先级高。

priority_queue<int,vector<int>,greater<int>> q;
  • greater表示这个数字越小,优先级越高
  • less表示数字越大,优先级越高(默认情况)

vector表示底层数据结构堆(heap)的容器

结构体优先级设置

#include<iostream>
#include<string>
#include<queue>
using namespace std;
struct fruit{
string name;
int price;
friend bool operator < (fruit f1,fruit f2){
return f1.price > f2.price;
}
}f1,f2,f3;
int main(){
priority_queue<fruit> q;
f1.name = "桃子";
f1.price = 3;
f2.name = "梨子";
f2.price = 4;
f3.name = "苹果";
f3.price = 1;
q.push(f1);
q.push(f2);
q.push(f3);
cout<< q.top().name<<" "<<q.top().price <<endl;
return 0;
}

output:

苹果 1

使用场景

可以用于dijkstra算法的顶点选择中

注意使用top()函数之前判断队列是否为空(使用empty()函数)

7.stack

栈,先进后出

头文件及定义

#include<stack>
using namespace std; stack<typename> name;

常用函数

函数 说明
push(x); 元素x入栈
top(); 获取栈顶元素
pop(); 栈顶元素出栈
empty(); 检测stack是否为空
size(); 获取栈的大小

使用场景

递归模拟,防止递归深度过深,深度优先搜索模拟。

8.pair

头文件及使用

#include<utility>
using namespace std;
//map实现中涉及pair,使用map时自动添加了该头文件 pair<typename1,typename2> name;
pair<string ,int > p("hahahah",7);
make_pair("haha",4);
cout<<p.first<<" "<<p.second;

【pat】C++之刷题常用STL容器整理的更多相关文章

  1. 刷题常用的STL容器总结

    本文归纳总结刷题常用到STL容器以及一些标准算法,主要包括: string.vector.map.pair.unordered_map.set.queue.priority_queue.stack,以 ...

  2. Sublime Text3 配置C++(附oj刷题常用模板)

    # 下载对应平台的sublime sublime最新版下载, 字体样式个人喜欢Consolas, 另附注册码: -– BEGIN LICENSE -– TwitterInc 200 User Lice ...

  3. PAT甲级训练刷题代码记录

    刷题链接:https://www.patest.cn/contests/pat-a-practise 1001 #include <iostream> #include <stdio ...

  4. ACM常用STL容器

    // STL(标准模板库),由三大部分组成:容器,算法,迭代器 // STL六大组件:container(容器),algorthm(算法),iterator(迭代器) // function obje ...

  5. C++ 刷题常用函数总结

    平时常用C++刷一些算法题,C++内置了许多好用的工具函数,但时间一长总是容易忘记,这里简单做一下总结,方便复习! <stdlib.h> atoi(const char* str) 将一串 ...

  6. ACM刷题常用链接

    武汉科技大学  http://acm.wust.edu.cn/ 华中科技大学 http://acm.hust.edu.cn/vjudge/toIndex.action 杭州电子科技大学  http:/ ...

  7. Java刷题常用API

    目录 输入输出 快速查看 最大最小值 string stringbuilder 集合 map queue stack set 优先队列 PriorityQueue (Heap) 数组 静态数组 动态数 ...

  8. STL容器整理

    1.vector c++STL中的可变长度数组,主要支持操作有:建立,添加到末尾,返回长度,调整大小,定义迭代器及对迭代器的具体操作.具体如下: 1.建立一个元素类型为int的可变长度数组v,最开始N ...

  9. java刷题时常用容器详解

    当初学java时,只是简单的把java基础知识过了一遍就跑去刷题了,很多知识都是在刷题的过程中慢慢加深理解的. 由于每次刷题时,刷到与容器有关的我基本上都跑去百度了,例如百度一下:java中List的 ...

随机推荐

  1. mysql外连接

    一,起因 在学习一个新知识之前,最好先了解一下你为何要学习这个知识,这个知识或技术能帮你做什么,可以给你带来哪些帮助.因此我先交代一下写这篇随笔的起因. 我在做项目的时候遇到了一个比较有意思的情况, ...

  2. vscode代码自动补全失效

    前段时间,朋友说自己的vscode突然出现了代码不能自动补全的问题(主要是js,其他语言也可以参考) 症状表现为,刚打开vscode有自动补全,过了一会,突然就没了,反反复复 解决过程也是相当坎坷了 ...

  3. Js 与浮点数

    同步发表在我的博客:jmingzi 当你学习一个知识点没有方向时,可以尝试以解决问题的角度来理解它. 例如这个知识点我们可以从以下问题开始: 你看的到 1 真的是整数 1 吗? 为什么0.1 + 0. ...

  4. 人生苦短,我用Python(2)

    1.for循环遍历字符串: string="人生苦短,我用Python" print(string) for ch in string: print(ch) for 循环语句还可以 ...

  5. git 知识,适合新手 滤清思路

    1,密钥 (公钥和私钥) @ 公钥放在服务器上(说白了这里的服务器就是远程仓库, 就是谁建立的远程仓库这个公钥就放在他的ssh设置那) @ 私钥 放在本地就行,不用动,就是你生产密钥的.ssh 文件里 ...

  6. 从KafkaConsumer看看Kafka(一)

      Kafka的消息模型为发布订阅模型,消息生产者将消息发布到主题(topic)中,一个或多个消费者订阅(消费)该主题消息并消费,此模型中发布到topic中的消息会被所有消费者所订阅到,先介绍Kafk ...

  7. spring源码学习(三)--spring循环引用源码学习

    在spring中,是支持单实例bean的循环引用(循环依赖)的,循环依赖,简单而言,就是A类中注入了B类,B类中注入了A类,首先贴出我的代码示例 @Component public class Add ...

  8. 面向对象的进阶(item系列,__new__,__hash__,__eq__)

      面向对象的进阶(item系列,__new__,__hash__,__eq__) 一.item系列 getitem.setitem.delitem(操作过程达到的结果其实就是增删改查) class ...

  9. 3种骚操作,教你查看 Java 字节码!

    在我们工作.学习.以及研究 JVM 过程当中,不可避免的要查看 Java 字节码,通过查看字节码可以了解一个类的编译结果,也能通过编译器层面来分析一个类的性能. 字节码文件是不能直接打开的,下面栈长教 ...

  10. iOS开发-APP图标、启动页、名字的设置

    APP图标.启动页.名字的设置:(较全面,但是APP启动页讲述的有漏洞) 参考链接:https://www.jianshu.com/p/2c7e181276ff APP启动页:(弥补上一文的漏洞) 参 ...