STL的常见用法

stl的介绍

C++中的STL标准模板库(Standard Template Library)是一组功能强大的C++模板类,它为通用类和函数提供模板,这些模板实现了许多流行和常用的算法和数据结构,如向量(vector)、列表(list)、队列(queue)和堆栈(stack)等等。

vector

vector可以理解成变长数组,它会根据需要自动增长;vector可以放任意的数据类型,可以方便、灵活地代替数组。

    #include<vector>    //需要的头文件
    vector<typename>v;    //定义一个向量,typename可以是(如vector<int>v;)int、string、char,也可以是node(结构体)等等..
    vector<typename>v(50)   //定义初始大小为50的向量
    vector<typename>v(50,0) //初始大小为50,元素全为0

    //二维数组的定义
    vector<typename>v[size];    //v[0]~v[size-1]中每一个都是一个vector容器
    vector<vector<typename> >v;   // 注意 vector<vector<typename> >v;里面的空格不能少哦

    //常用的操作
    vector<int>v;   //先定义一个向量

    v.push_back(x);    //把x加入v中(在尾部插入)
    v.push_back(1);    //插入int型1
    v.push_back('1')    //插入char型1

    v.pop_back();   //删除最后一个元素

    v.back();    //返回最后一个元素
    v.size();   //返回v的大小
    v.clear();  //清空数组  时间复杂度O(N)!!
    
    //访问方式
    v[0];   //可以按数组的格式随机访问
    cout<<v[0];    //输出也一样

    vector<typename>::iterator it;   //用迭代器访问(先定义,typename要跟前面定义的向量对应)
    for(it=v.begin();it!=v.end();it++){
        cout<<*it;  //输出元素
    }

刷题应用:可以无需用多余的变量来存数组的长度。


set

set是一种包含已排序对象的关联容器。它的底层是一颗红黑树。set会自动排序,去重。
特别注意的是:set不能修改元素的值,因为set元素是常量

    #include<set>   //需要的头文件
    set<typename>s;   //typename是数据类型名,可以是int、double、string等等..

    //常用的操作
    s.size()    //返回集合的大小
    s.empty()   //判断集合是否为空,若为空返回ture

    s.begin()   //返回指向第一个元素的迭代器
    s.end()     //返回指向最后一个元素的迭代器

    s.rbegin()  //返回指向集合中最后一个元素的反向迭代器
    s.rend()    //返回指向集合中第一个元素的反向迭代器

    s.insert()    //在集合中插入元素
    s.insert(1)    //插入元素1

    s.erase()   //删除集合中的元素
    s.erase(1)  //删除键值为1的元素

    s.find()    //返回一个指向被查找到元素的迭代器
    it=s.find(1)   //如果找到就it!=s.end(),否则it==s.end()

    s.clear()   //清空集合  时间复杂度为O(N)!!

    //访问或遍历
    set不能直接访问,需要用到迭代器
    set<typename>::iterator it;//定义迭代器

    for(it=s.begin();it!=s.end();it++){ //遍历输出
        cout<<*it;  //输出元素
    }

刷题的应用:如果题目需要去重且需要排序的,就可以将元素存到set中。


map

map是一类关联式容器。map中有关键字(key)跟值(value)。
map会自动按key升序排序
unordered_map则不会

    #include<map>   //需要的头文件
    map<typename1,typename2>mp; //定义key->value关系的map(key跟value的类型可以是任意的)
    map<string,int>mp;  //例如:关键字key为string,对应的值value为int型

    #include<unordered_map>    //不自动排序的map的头文件
    unordered_map<tyoename1,typename2>mp;  //不自动排序的map的定义

    //常用的操作
    
    //插入
    mp.insert(pair<string, int>("john",98)); //插入key为“john”,value为98的元素
    mp["john"]=98    //也可以直接这样

    //输出
    cout<<mp["john"];
    //迭代器访问
    map<string,int>::iterator it; 
    for(it=mp.begin();it!=mp.end();it++){
        cout<<*it->first<<' '<<*it->second<<endl>>;
    }

    it=mp.find(key)    //查找关键字,不存在则返回it=mp.end()
    mp.erase(it)  //删除it指向的映射
    mp.size()   //返回map的大小
    mp.clear()  //清空map   时间复杂度为O(N)

刷题应用:当只需要查询时,可以使用unordered_map来实现O(1)的时间复杂度,或者用来确认某个待插入的元素是否时第一次出现的。


string

C++在STL中加入了string类型,对字符串常用的需求功能进行了封装,使得操作起来更方便,且不易出错。

    #include<string>    //需要的头文件
    using namespace std;//别忘了加这个哦

    string str; //定义一个string
    string str="我要学string" //也可以直接赋值

    //输入
    cin>>str;   //遇到空格结束
    getline(cin,str);   //遇到回车结束
    scanf("%s",str.c_str);  //用scanf输入需要以str.c_str()形式输出

    //输出
    cout<<str;  
    printf("%s",str.c_str());   //用c_str()将string类型转化为字符数组进行输出

    //访问
    str[0]; 可以像字符数组那样访问string
    string::iterator it;    通过迭代器访问
    for(it=str.begin();it!=str.end();it++){
        cout<<*it;
        //printf("%c",*it);
    }

    //string可以直接用‘+’号对两个string进行拼接
    string str1="abc",str2="xyz",str;
    str=str1+str2;  //此时str="abcxyz"

    //两个string可以直接按照字典序的规则进行比较
    if(str1==str2)
    if(str1!=str2)
    if(str1>str2)   //或者>=
    if(str1<str2)   //或者<=

    str.length()
    str.size()  //两个都是返回字符串的长度

    str.insert()    //插入
    str.insert(index,string);   //在index号插入字符串string
    string ="abc",str2="123";
    str.insert(2,str2);  //此时str="ab123c";

    str.erase()    //删除单个字符或一个区间的所有元素。时间复杂度:O(N)
    str.erase(it)   //删除it指向的字符
    str.erase(first,last)   //删除[first,last)区间内的元素
    str.erase(index,length) //删除从index开始length个元素

    str.clear() //清空数据
    
    str.substr()    //截取子串
    str.substr(index,len)   //返回从index位开始,长度为len的子串

    str.find()  //查找子串
    str.find(str2)  //返回str2第一次出现的位置
    
    str.replace()   //替换
    str.replace(index,len,str2)   //把str从index号位开始,长度为len的子串替换为str2
    str.replace(it1,it2,str2)   //把str的迭代器[it1,it2)范围的子串替换为str2


queue

queue是队列的意思,在STL中主要是实现一个先进先出的容器。

    #include<queue> //需要的头文件
    queue<typename> q;  //定义一个队列

    //访问,队列只能访问队首、队尾元素
    q.front()   //访问队首
    q.back()    //访问队尾

    //常用操作
    q.push()    //入队
    q.push(x)   //x入队

    q.pop() //出队

    q.empty()   //判断队列是否为空
    q.size()    //返回队列大小

stack

stack的意思是栈,是STL中实现一个后进先出的容器。

    #include<stack> //需要的头文件
    stack< typename >s; //定义一个栈

    s.push()    //入栈
    s.pop()     //出栈

    s.top()     //返回栈顶元素
    s.empty()   //判断栈是否为空
    s.size()    //返回栈内元素的个数
    
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pair是STL中的一个容器,用于将两个数据组合成一组数据。它在一些场景下非常有用,比如用作map的键值对插入,或者当一个函数需要返回两个数据时可以选择使用pair。你可以通过pair的first和second成员访问其中的元素。例如,如果有一个pair<int, int> p,你可以使用p.first访问第一个元素,使用p.second访问第二个元素。在C++中,pair的实现是一个结构体。以下是一个示例代码,展示了pair的使用方法: ``` #include <utility> #include <iostream> using namespace std; int main(){ pair<int, int> p<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [c++ STL pair简单用法](https://blog.csdn.net/weixin_45063703/article/details/127915225)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C++ pair的基本用法总结整理](https://download.csdn.net/download/weixin_38621624/13709830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [STL之pair常见用法详解](https://blog.csdn.net/qq_41140987/article/details/106120500)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值