C++ STL学习

首先声明:本文内容全部来自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 arr1000000;

如果放在主函数中会爆栈,把它放在全局变量就不会

但是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;
 }

7.2 适用情形以及注意事项

终于到了最后一个stl了!!!!

8、pair二元组

8.1 常用方法

8.2 适用场景及注意事项

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
2401_841495644 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr4 小时前
2607C++,soui与安卓
c++·soui
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a1117767 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao7 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
fqbqrr8 小时前
2607C++,使用微软detours勾挂工具
c++