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

7.2 适用情形以及注意事项

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

8、pair二元组

8.1 常用方法

8.2 适用场景及注意事项

相关推荐
AI+程序员在路上2 分钟前
C#调用c++dll的两种方法(静态方法和动态方法)
c++·microsoft·c#
一只会飞的猪_22 分钟前
国密加密golang加密,java解密
java·开发语言·golang
四念处茫茫37 分钟前
【C语言系列】深入理解指针(2)
c语言·开发语言·visual studio
mit6.82442 分钟前
What is Json?
c++·学习·json
LucianaiB43 分钟前
C语言之图像文件的属性
c语言·开发语言·microsoft·c语言之图像文件的属性
向着开发进攻43 分钟前
深入理解 Java 并发编程中的锁机制
java·开发语言
CURRY30_HJH1 小时前
JAVA 使用反射比较对象属性的变化,记录修改日志。使用注解【策略模式】,来进行不同属性枚举值到中英文描述的切换,支持前端国际化。
java·开发语言
weixin_SAG1 小时前
14天学习微服务-->第1天:微服务架构入门
学习·微服务·架构
千千道1 小时前
QT 中 UDP 的使用
开发语言·qt·udp
灶龙1 小时前
浅谈 PID 控制算法
c++·算法