首先声明:本文内容全部来自bilibili的【【C++】算法竞赛常用 STL 用法】 https://www.bilibili.com/video/BV1L8411y7th/?share_source=copy_web\&vd_source=6548350a40ddeb68e9c477994f630bf0这个视频,在此对up主表示感谢,大家也可以直接去看原视频
1、vector
1.1 vector常用函数
#include <bits/stdc++.h>
int main()
{
vector<int> arr;
vector<double> dou(100,1);
//构造一个长度为100的double类型的数组,初始化为1。不指定的话默认初始化为0
vector<vector<int>> dp(5,vector<int> (6,10));
//二维数组就是n个一维数组的数组,因此定义二维数组就是vector<vector<int>>
//dp(5,vector<int> (6,10)) 5表示5行,后面的vector<int> (6)表示6列,(6,10)的10表示给数组元素赋值
vector<vector<vector<int>>> dp2(5,vector<vector<int>> (6,vector<int> (4)));
//一个三位数组,等价于 int mat[5][6][4]
//-------------------------------------------------------
vector<int> arr;
arr.push_back(1);//尾接
arr.pop_back();//用一次弹出一个,想要弹出两个元素就再加上一行
cout<< arr.size() <<endl; //获取长度 size函数
arr.clear(); //清空数组
arr.empty();//判断是否为空,返回1表示为空,返回0表示不为空
//-------------------------------------------------------
vector<int> arr;
arr.push_back(1);
arr.push_back(2);
arr.push_back(3);
arr.resize(5,3);
//改变arr的长度,从3变到5,数组里只有3个元素,第二个参数如果不设置则末尾两个元素默认为0
arr.resize(1);//改短,末尾的两个会被删除
return 0;
}
1.2 适用场景
普通数组 int arr[1000000];
如果放在主函数中会爆栈,把它放在全局变量就不会
但是vector就不会有这个爆栈的问题
1.3 注意事项
.size()函数返回的数据类型不是int,不是long long,而是size_t,size_t是oj平台使用的编译器有关的
2、stack 栈
2.1 常用函数
#include<bits/stdc++.h>
using namespace std;
int main()
{
stack<double> stk;
stk.push(1.0);//进栈
stk.push(2.0);
cout << stk.size() <<endl;//查看栈的大小
cout << stk.empty() <<endl;//查看栈是否为空
cout << stk.top() <<endl;//查看栈顶元素,是2.0
//------------------------
// vector当作栈来用
vector<double> vec;
vec.push_back(1.0);
vec.push_back(2.0);
vec.pop_back();//弹出栈顶元素
cout << vec.back() << endl;//取栈顶元素
return 0;
// stk.pop();//弹出栈顶元素
}
2.2 适用情形
上述代码中已经展示了vector当作stack的代码,在此不作赘述
2.3 注意事项
stack只能访问栈顶、压栈、出栈
3、queue
3.1 常用函数
#include<bits/stdc++.h>
using namespace std;
int main()
{
queue<int> que;
que.push(1); //入队
que.push(2);
que.push(3);
cout << que.front() << endl; //取队头元素
cout << que.back() << endl; //取队尾元素
que.pop(); //出队
cout << que.front() << endl;
cout << que.back() << endl;
cout << que.size() << endl; //取队列的长度
return 0;
}
3.2 使用情形及注意事项
4、优先队列
4.1 优先队列就是堆
#include<bits/stdc++.h>
using namespace std;
int main()
{
//大顶堆----------------------------------------
priority_queue<int> pque;//默认构造一个大顶堆,即队头元素是堆顶
pque.push(1);
cout << pque.top() << endl; //获取堆顶元素,也即最大元素
pque.push(3);
cout << pque.top() << endl;
pque.push(4);
cout << pque.top() << endl;
pque.push(2);
cout << pque.top() << endl;
pque.pop();//弹出堆顶元素,也就是把最大元素弹出来了
cout << pque.top() << endl;
//小顶堆------------------------------------------
priority_queue<int,vector<int>,greater<int>> pque1;
//第二个参数表明底层是用什么存的,第三个参数表示这是一个小顶堆
pque1.push(1);
cout << pque1.top() << endl; //获取堆顶元素,也即最小元素
pque1.push(3);
cout << pque1.top() << endl;
pque1.push(4);
cout << pque1.top() << endl;
pque1.push(2);
cout << pque1.top() << endl;
pque1.pop();//弹出堆顶元素,也就是把最小元素弹出来了
cout << pque1.top() << endl;
return 0;
}
4.2 适用情形
4.3 注意事项
5、集合set
5.1 常用函数
#include<bits/stdc++.h>
using namespace std;
int main()
{
set<int> st;
st.insert(1); //向集合中插入元素
st.insert(2);
st.insert(4);
st.insert(2);
st.erase(2);
if(st.find(2) != st.end()) //find()函数,查找是否有指定的元素
{
cout << "yes" << endl;
}
if(st.count(2))cout<< "Yes" << endl;// count()函数,统计指定元素有几个
for(auto &ele:st)
cout << ele << endl;
cout << st.size() << endl; //获取集合的长度
st.clear(); //清空集合
cout << st.empty() << endl; //判断集合是否为空,1表示为空,0表示不为空
return 0;
}
5.2 遍历,使用迭代器进行遍历
5.3适用情形及注意事项
6、map映射
6.1 常用用法
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<int,int> mp;// 第一个参数是键的映射,第二个参数是值的映射,int类型映射到int类型
//map<string,int> mp; //string --> int
//map<string,vector<int>> mp; //string --> vector<int>>
mp[2] = 1;//建立一个2到1的映射
mp[2] = 2;//映射可以修改
cout << mp.size() << endl; //长度
cout << mp.empty() << endl;//判空,0表示不为空,1表示为空
mp.clear(); //清空
//如果没有建立映射,就会输出0
//cout << mp[2] << endl;
mp.erase(2);
//擦除2这个键
cout << mp.count(2) << endl;// 返回2这个键在map中出现了几次
if(mp.find(2)!=mp.end())cout<< "yes" << endl;//find()函数返回查询到的元素的位置的迭代器,如果找不到就会返回尾迭代器
else cout << "no" <<endl;
//------------------------------------------------------------------
mp[2] = 1;
mp[9] = 3333;
mp[3] = 2;
//map遍历
for(map<int,int>::iterator it = mp.begin();it != mp.end();++it)
{
cout<< it->first << ' ' << it->second <<endl;
}
//c++11版本遍历
for(auto &pr : mp)
{
cout << pr.first << ' ' << pr.second << endl;
}
return 0;
}
运用map可以统计一段文章中出现的单词的个数
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<string,int> mp;
vector<string> word;
word.push_back("awa");
word.push_back("awa");
word.push_back("awa");
word.push_back("bwb");
word.push_back("bwb");
for(int i=0;i<word.size();i++)
{
mp[word[i]]++;
}
for(auto &pr : mp)
{
cout << pr.first <<' ' << pr.second <<endl;
}
return 0;
}
6.2 注意事项
7、字符串string
7.1 常用方法
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1 = "123123123";
s1 += 'a'; //拼接字符串
cout << s1.substr(3) <<endl;
//substr()函数返回从下标位置为3开始的子串
cout << s1.find("312") << endl;//返回第一个"312"子串的3的下标
if(s1.find("312")!=string::npos)
{
cout<<"yes"<<endl;
}
cout << s1.substr(3,3) <<endl;
//substr()函数返回从下标位置为3、长度为3的子串
int x = stoi(s1);
//stoi()函数把字符串类型的数字转为int类型,同理也有stoll(string->long long),stod(string->double),stold(string->long double,默认保留6位有效数字)
long double x1 = stold(s1);
cout<<x1<<endl;
return 0;
}
将int类型变量转为字符串类型
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x = 999;
string s = to_string(x);
cout << s << endl;
return 0;
}