常用 STL 容器基本详细用法 总结归纳

vector

  • 头文件
#include <vector>
  • 定义
vector <int> a //最常用, 定义一个不定长的数组
vector <string> a(4) //定义一个长度为4的string数组
vector <int> a(10,3)// 定义一个长度为十的数组,并且每个元素初始化为3
vector <int> a[10] //定义了十个vector数组,相当于二维数组(一维变长)
vector <vector <int>> a //定义一个二维数组(二维变长)
  • 常用函数
a.size() //返回数组的大小
a.empty() //返回a是否为空,空返回true
a.clear() //清空数组,队列没有这个函数
a.front() //返回数组的第一个元素
a.back() //返回数组的最后一个元素
a.push_back() //在数组的最后插入一个元素
a.pop_back() //将数组的最后一个元素弹出
a.begin() / a.end() //支持迭代器,首尾元素的迭代器
a.insert(a.begin() + 2, 666)  //在a[2]的位置插入666这个数,原来位置上的数以及后面的数向右顺移,时间复杂度为0(n)
a.erase(a.begin() + 2, a.begin() + 4)  // erase(first,last)即删除 [ first , last) 内的所有元素,时间复杂度为0(n)
  • 遍历
for (int i = 0; i < a.size(); i ++) cout << a[i];  //利用数组下标
for (auto x : a) cout << x; // 范围遍历
for (vector<int>::iterator i = a.begin(); i != a.end(); i ++) cout << *i;//迭代器遍历,i相当于一个指针,输出时解引用
for (auto i = a.begin(); i != a.end(); i ++) cout << *i;//迭代器遍历,上一种的简化写法
  • 去重
vector <int> s;
auto end_unique = unique(s.begin(), s.end());
s.erase(end_unique, s.end());
  • 支持比较运算,根据字典序比较
vector <int> a(3, 4);
vector <int> b(4, 3);
if (a < b) cout << "YES"; // a 和 b可以进行比较,按字典序比较各元素

注:所有容器都含有size 和 empty 两个函数,并且时间复杂度为0(1)
注:所有容器都可以通过auto的方式进行遍历




pair

  • 不需要额外添加头文件,< iostream > 已经隐式地包含了pair 的 头文件
  • 可以看成是二元结构体,并自带比较函数
  • 定义
pair< int , string > a //存储一个二元组,必须提供两个类型名,两个对应的类型名的类型不必相同
pair< int , string > a[N] //定义一个pair类型的数组
	
pair< int , string > a(6, "ywt") //可以定义时初始化
a = make_pair(10, "8"); //初始化
a = {10, "*"}; //初始化
	
pair< int, pair< int, int > > a; //这样pair可以存储三个元素
	
typedef pair <int, int> PII; //可以使用typedef简化定义
PII s; //定义了一个pair
  • 遍历
for (int i = 0; i < a.size(); i ++) 
	cout << a[i].first << " " << a[i].second;  //利用数组下标访问二元组中第一个元素和第二个元素

for (auto x : a) cout << x.first << " " << x.second; // 范围遍历
  • 支持比较运算,根据字典序比较,以first为第一关键字,以second为第二关键字
pair <int, int> a(3, 4);
pair <int, int> b(4, 3);
if (a < b) cout << "YES"; // a 和 b可以进行比较,按字典序比较各元素
  • 支持变量间赋值
pair <int, int> a(3, 4);
pair <int, int> b(4, 3);
a = b; // a 和 b可以相互赋值



string

  • 不需要额外添加头文件,< iostream > 已经隐式地包含了string 的 头文件
  • 定义
string a; //定义一个字符串

  • 常用函数
a.size() / a.length() //返回字符串的大小
a.empty() //返回a是否为空,空返回true
a.substr(pos, n) //截取从下标为pos的位置开始的长度为n的字符串,当pos + n > a.size(),则将pos到字符串末尾的部分返回,pos缺省为0,n缺省为a.size() - pos,也就是从pos开始的余下字符串
a.c_str() //返回a的起始地址 ;可以搭配printf()使用,printf("%s", a.c_str());
a.clear() //清空字符串
a.compare(str) //a与str进行比较
a.find(str, pos) //从下标pos的位置开始寻找str这个子串,pos缺省为0,返回字串起始字母在字符串中第一次出现的位置,找不到则返回-1
reverse(a.begin(), a.end()) //实现str的反转
str.erase(10);// 从位置pos=10处开始删除,直到结尾
str.erase(6, 4);// 从位置pos=6处开始,删除4个字符

  • inset函数

  • 遍历

for (int i = 0; i < a.size(); i ++) 
	cout << a[i]; 

for (auto x : a) cout << x; 

  • 可以cout直接输出整个字符串
string a = "ywt";
cout << a;

  • 支持直接加上字符或字符串
string a;
a += "ywt"; //可以直接与字符串相加,相当于在a字符串的末尾进行拼接
a += '!'; //也可以在末尾拼接一个字符

  • int 转 string 类型
#include <sstream>
 
// 方法1
int num = 666;
stringstream ss;
ss << num;
string s1 = ss.str();
 	
// 方法2
string s2;
ss >> s2;
 
// 方法3
string s3;
s3 = to_string(num);    // C++11 标准

  • string 转 int 类型
// 方法1
string str = "1234";
int num = atoi(str.c_str()); //#include <stdlib.h> 
//尽量使用atoi,版本低的codeblocks无法使用stoi,记得字符串要加.c_str()

//方法二
istringstream ss(str); //#include <sstream>
ss >> num;


  • string转化为大写
string source;
string dest;

//方法一 transform函数 (在alogorithm头文件中)
transform(source.begin(), source.end(), dest.begin(), ::toupper); //转大写,小写tolower

//方法二
for (int i = 0; i < str1.size(); i ++) str1[i] = toupper(str1[i]);



queue

  • 头文件
#include <queue>
  • 定义和遍历同vector一样,不重复赘述

  • 常用函数

a.push() //向队尾插入一个元素
a.pop() //弹出对头元素
a.front() // 返回队头元素
a.back() // 返回队尾元素
a.size() //返回队列的大小
a.empty() // 返回队列是否为空
队列没有clear函数,想要清空,可以这么写 a = queue<int>();



priority_queue

相当于是一个堆,默认是大根堆

  • 头文件
#include <queue>
  • 定义和遍历同vector一样,不重复赘述

  • 常用函数

a.push() //向堆中插入一个元素
a.pop() //弹出堆顶元素
  • 构建小根堆的方法
//方法一
a.push(-x) //构建小根堆,原数据为x

//方法二
priority_queue<int, vector<int>, greater<int>> a;



stack

  • 头文件
#include <stack>
  • 定义和遍历同vector一样,不重复赘述

  • 常用函数

a.push() //向栈顶插入一个元素
a.pop() //弹出栈顶元素
a.top() //返回栈顶元素
a.empty() //返回栈是否为空
a.size() //返沪栈的大小
没有clear()函数



deque

双端队列

  • 头文件
  • 定义和遍历同vector一样,不重复赘述

  • 常用函数

a.size()
a.empty()
a.clear()
a.front() / a.back()
a.push_back() / a.pop_back()
a.push_front() / a.pop_front()
a.begin() / a.end()
支持随机访问



set / multiset

  • 头文件
#include <set>
  • set中无重复元素
  • multiset中可以有重复元素
  • 二者基于平衡树,动态维护有序序列
  • 常用函数
a.size()
a.empty()
a.clear()
a.begin() / a.end()
a.insert() //logn
a.find() //若不存在,返回end()
a.count() //返回个数
a.erase(x) //若x是一个数,删除所有值等于x的元素 0(k + logn); 若x是一个迭代器,删除这个迭代器
a.lower_bound(x) // 返回大于等于x的最小值的迭代器,若不存在返回end()
a.upper_bound(x) // 返回小于等于x的最大值的迭代器,若不存在返回end()

map / multimap

  • 二者基于平衡树,动态维护有序序列

  • 常用函数

insert() //插入pair
erase()//pair或迭代器
find()
支持【】访问,但是时间复杂度是0(logn),数组的下标访问是0(1)
也支持lower_bound()/upper_bound()
除了常用的size(),empty(),clear()以外,其余操作时间复杂度基本上都是0(logn)

unordered_map

unordered_map <string, int> week = {{"MON", 1}, {"TUE", 2}, {"WED", 3}, {"THU", 4}, {"FRI", 5}, {"SAT", 6}; //定义时初始化
  • key的类型需要支持比较,所以vector可以作为map的变量类型
vector <string> strs;
map <vector <string>, int> hash;
hash[strs] ++;

unordered_set、unordered_multiset、unordered_multimap、unorderd_map

功能与上述类似
不同之处在于,其增删改查的操作时间复杂度是0(1),但是不支持lower_bound()/upper_bound()
也不支持迭代器加加减减(凡是与排序有关的操作均不支持)

bitset

功能:实现压位
例如:c++中bool变量占1个字节,使用bitset,可以实现一个bool变量占一位,减少8倍空间

  • 定义
bitset <10000> a;
  • 运算
支持 ~, |, &, ^, >>, <<, ==, !=, []运算符号
count()返回有多少个1
any()判断至少有一个1
none() 判断为空,全为0
set() 将所有位置置为1
set(k, v)将第k位置为v
reset()将所有位置为0
flip()将所有位取反
flip(k)将第k位取反
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只可爱的小猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值