【蓝桥杯冲刺省一,省一看这些就够了-C++版本】蓝桥杯STL模板及相关练习题

news2024/11/24 6:32:36

蓝桥杯历年省赛真题

点击链接免费加入题单

STL

map及其函数

map<key,value> 提供一对一的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map 中的第一个值称为关键字(key),每个关键字只能在 map 中出现一次,第二个称为该关键字的值(value),可以重复。

// 定义,以 string, int 对为例
#include <map>
map<string, int> mp;     // 底层是红黑树,元素可比较大小,key 的结构体要重载 < 运算

// 2- 插入
mp.insert(make_pair("zhs", 18));        // 插入一个键值对,若原先存在该 key,则无法插入和覆盖
mp.insert(pair<string,int>("zhs", 18)); // 插入一个键值对,若原先存在该 key,则无法插入和覆盖
mp["zhs"] = 18;                         // 甚至可以类似数组下标去访问 key 对应的 value,若原先不存在该 key,则创建,若原先存在,则覆盖以前该关键字对应的值
mp.emplace("zhs", 18);                  // 插入效果跟 insert 效果完全一样

// 3- 删除
mp.erase(key);     // 删除值为 key 的元素
mp.erase(iter);    // 删除迭代器 iter 指向的元素,例如 mp.erase(mp.begin());
mp.erase(iter1, iter2); // 删除区间 [iter1, iter2) 的所有元素,例如 mp.erase(mp.begin(), mp.end());
mp.clear();        // 清空集合

// 3- 求大小
int siz = mp.size();         // 求集合大小
bool flag = mp.empty();      // 集合判空

// 4-查询
if(mp.find(key) != mp.end())           // find 函数返回一个指向被查找到元素的迭代器
    cout << mp[key] << endl;
if(mp.count(key))                // count 返回某个值元素的个数
    cout << mp[key] << endl;
auto iter = mp.lower_bound(key);   // 求 key 的下界,返回指向大于等于某值的第一个元素的迭代器
auto iter = mp.upper_bound(key);   // 求 key 的上界,返回大于某个值元素的迭代器

// 5-遍历
map<string, int>::iterator iter;             // 正向遍历
for(iter=mp.begin(); iter!=mp.end(); iter++)
{
    cout << iter->first << " " << iter->second << endl;
    // 或者
    cout << (*iter).first << " " << (*iter).second << endl;
}
map<int>::reverse_iterator riter;    // 反向遍历
for(riter=mp.rbegin(); riter!=mp.rend(); riter++)
{
    // 遍历的同时修改
    iter->second += 10;
    cout << iter->first << " " << iter->second << endl;
}
for (auto x : mp){               // C++ 11 auto 遍历
    cout << x.first << " " << x.second << endl;
}
for (auto& x : mp){               // C++ 11 auto 遍历
    x.second += 10;   // 遍历并修改
    cout << x.first << " " << x.second << endl;
}

// 6- 求最值
map<string, int>::iterator it = mp.begin();    // 最小值
cout << *it << endl;
map<string, int>::iterator it = mp.end();      // 最大值
cout << *(--it) << endl;

/*
1. map 和 set 一样,其中的元素必须支持 < 运算符
2. 在插入时,使用 insert 和 用数组方式去插入,在原先存在要插入的键值时是有区别的,insert不会插入,用数组方式插入则会直接覆盖原先数据
3. map 的迭代器支持 ++、--、==、!=、(*iter).first、 (*iter).second、iter->first、 iter->second 等操作
4. map 的迭代器不支持 +、-、 +=、-= 等算术操作符,也不支持 >、<、>=、<= 等比较操作符
*/

map的插入与遍历
#include<bits/stdc++.h>

using namespace std;

map<string,int> m;

int main(){
    int n,age;
    string s;
    cin >> n;
    for(int i = 1;i <= n;i++){
        cin >> s >> age;
        m[s] = age;
    }
    map<string,int>::iterator it;
    for(it = m.begin();it != m.end();it++){
        cout << it->first<< " "<< it->second<<endl;
    }
}
map的查询
#include<bits/stdc++.h>
using namespace std;
map<string,string> ma;
pair<string,string> p;
int main(){
    int m,n,a;
    string s,t,str;
    set<string,string>::iterator it;
    cin >> n >> m;
    for(int i=1;i<=n;i++){
        cin >> s >> t;
    
        p.first = s;
        p.second = t;
        ma.insert(p);
    } 
    for(int i=1;i<=m;i++){
        cin >> a>> str;
        if(a==1){
            if(ma.find(str)!=ma.end()){
                cout << ma[str];
            }else{
                cout << "NO";
            }
        }
        if(a==2){
            if(str <= (ma.begin()->first))
            {
                cout<<"NO";
            }
            else{
                auto it = ma.lower_bound(str);
                it--;
                cout<< it->second;
            }
        }
        if(a==3){
            if(str >= ((--ma.end())->first))
            {
                cout<<"NO";
            }
            else{
                auto it = ma.upper_bound(str);
                cout<<it->second;
            }
        }
        cout << endl; 
    }
}

set及其函数

set 的含义是集合,它是一个 有序 的容器,里面的元素都是排序好的,支持插入、删除、查找等操作,就像一个集合。所有的操作的都是严格在 O ( l o g n ) O(logn) O(logn) 时间之内完成,效率非常高。 set 和 multiset 的区别是:set插入的元素不能相同,但是 multiset 可以相同。

// 1- 定义
#include <set>
set<int> s;     // 元素必须可比较大小,元素类型必须要支持 < 运算,结构体需要重载 <

// 2- 插入
s.insert(key);    // 插入

// 3- 删除
s.erase(key);     // 删除值为 key 的元素
s.erase(iter);    // 删除迭代器 iter 指向的元素,例如 s.erase(s.begin());
s.erase(iter1, iter2); // 删除区间 [iter1, iter2) 的所有元素,例如 s.erase(s.begin(), s.end());
s.clear();        // 清空集合

// 4- 求大小
int siz = s.size();         // 求集合大小
bool flag = s.empty();      // 集合判空

// 5-查询
if(s.find(key) != s.end())           // find 函数返回一个指向被查找到元素的迭代器
    cout << "exist" << endl;
if(s.count(key) == 1)               // count 返回某个值元素的个数
    cout << "exist" << endl;


set<int>::iterator iter = s.lower_bound(key);   // 求 key 的下界,返回指向大于等于某值的第一个元素的迭代器
set<int>::iterator iter = s.upper_bound(key);   // 求 key 的上界,返回大于某个值元素的迭代器

// auto 类型推断关键字 在NOI 系列比赛中也可以使用了
auto iter = s.lower_bound(key);   // 求 key 的下界,返回指向大于等于某值的第一个元素的迭代器
auto iter = s.upper_bound(key);   // 求 key 的上界,返回大于某个值元素的迭代器

// 6-遍历
set<int>::iterator iter;             // 正向遍历
for(iter=s.begin(); iter!=s.end(); iter++)
{
    cout<<*iter<<endl;
}
set<int>::reverse_iterator riter;    // 反向遍历,不重要
for(riter=s.rbegin(); riter!=s.rend(); riter++)
{
    cout<<*riter<<endl;
}

// 7- 求最值
set<int>::iterator it = s.begin();    // 最小值
cout << *it << endl;
set<int>::iterator it = s.end();      // 最大值
cout << *(--it) << endl;

/*
注意:
1. set 和优先队列一样,其中的元素必须支持 < 运算符
2. set 的迭代器支持 ++、--、==、!=、*iter 等操作
3. set 的迭代器不支持 +、-、 +=、-= 等算术操作符,也不支持 >、<、>=、<= 等比较操作符
*/
set的插入与遍历
#include<bits/stdc++.h>
using namespace std;
int main(){
    set<int> s;//set可以自动去重和排序,默认升序 
    int n,t;
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> t;
        s.insert(t);//set没有push_back操作 
    }
    set<int>::iterator it;//set需要使用迭代器遍历数据 
    for(it=s.begin();it!=s.end();it++){//set支持双向迭代器 
        cout << *it << " ";
    }
}
set的查询
#include<bits/stdc++.h>
using namespace std;
int n, m, c, x;
set<int>a;
set <int, greater<int>> b;
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int t;
        cin >> t;
        a.insert(t);
        b.insert(t);
    }

    for (int i = 1; i <= m; i++) {
        cin >> c >> x;
        if (c == 1) {
            if (a.find(x) != a.end())cout << x << "\n";
            else cout << "NO\n";
        }
        if (c == 2) {
            set<int>::iterator it;
            it = b.upper_bound(x);//二分查找,找第一个大于x的数的地址
            if (it != b.end()) {
                cout << *it << "\n";
            } else cout << "NO\n";
        }
        if (c == 3) {
            set<int>::iterator it;
            it = a.upper_bound(x);
            if (it != a.end()) {
                cout << *it << "\n";
            } else cout << "NO\n";
        }
    }
}

priority_queue优先队列

因为堆的作用主要是用来获取最大/最小值,类似队列的取最值操作,因此堆有一个别名叫优先队列。在 STL 中提供了"优先队列“的模板,即 priority_queue。关于优先队列具体的应用会在二叉堆与对顶堆中详细讲解。

  • 常见使用
#include <queue>
using namespace std;
// using std::priority_queue;
priority_queue<int> q;    // 定义一个空的优先队列,默认是大根堆

void test()
{
    
    int x = 5;
    q.push(x);       // 将 5 插入堆,这时堆顶是 5
    q.push(3);       // 将 3 插入堆,这时堆顶是 5
    q.push(2*x);     // 将 10 插入堆,这时堆顶是 10
    int k = q.top(); // 取堆顶元素,应该是 10
    q.pop();         // 删除堆顶元素,删除了 10,这时堆顶为 5
    int s = q.size();// 求堆中元素个数,应为 2
    // 清空优先队列的一种方法
    while(!q.empty())
        q.pop();
    // 清空优先队列的第二种方法
    q = priority_queue<int>();
}
  • 实现小根堆
// 大根堆改成小根堆,其中 vector<Type> 为内部存储容器,greater<Type> 为比较方式
priority_queue<Type,vector<Type>,greater<Type>> q; 

// 常为 int 类型
priority_queue<int,vector<int>,greater<int>> q; 

  • 优先队列与结构体重载运算符
// 只能用于大根堆的结构体
struct node{
    int val;
    string info;
    ...
    // 大根堆,重载小于运算符
    bool operator <(const node& other) const {
        return val < other.val;
    }
};
// 定义一个大根堆(默认)
priority_queue<node> q;

// 只能用于小根堆的结构体
struct node{
    int val;
    string info;
    ...
    // 小根堆,重载大于运算符
    bool operator >(const node& other) const {
        return val > other.val;
    }
};
// 定义一个小根堆(默认)
priority_queue<node,vector<node>,greater<node>> q;

pair

将两个变量成对组合打包在一起的数据类型,可以理解为C++内置的保存两个元素(类型可以自定义)的结构体常见的应用就是保存坐标等
pair 支持比较运算符。其比较规则是:先比较第一个元素,如果第一个元素值相等,再比较第二个元素。

pair<int,int> pos;
pos.first = 1;
pos.second = 1; 
a = make_pair(1,1);
a = pair<int,int>(1,1);

vector及其函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

vector插入
#include<bits/stdc++.h>
using namespace std;
int a[15];
int main(){
    int n,x,y;
    cin >> n ;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    cin >> x >> y;
    vector<int> v(a+1,a+n+1);
    v.insert(v.begin()+x-1,y);
    for(int i=0;i<v.size();i++){
        cout << v[i] << endl;
    }
}
vector遍历
#include<bits/stdc++.h>
using namespace std;
vector<int> a[100100];
int n,m,i,j,x,y; 
int main(){
    cin >> n>> m;
    for(i=1;i<=m;i++){
        cin>> x>> y;
        a[x-1].push_back(y);//这里使用a[x]也是可以的
    }
    for(i=0;i<n;i++){
        cout << a[i].size();
        sort(a[i].begin(),a[i].end());//对每一个向量排序
        for(j=0;j<a[i].size();j++){
            cout << " "<<a[i][j];
        } 
        cout<< endl;
    }
    return 0;
}
vector排序
#include<bits/stdc++.h>
using namespace std;
vector<int> a[1005];//定义向量数组
int main(){
    int n,c,x;
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> c;
        for(int j=1;j<=c;j++){
            cin>> x;
            a[i].push_back(x);
        }
        sort(a[i].begin(),a[i].end());
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++){
        for(int j=0;j<a[i].size();j++){
            cout << a[i][j]<< " ";
        }
        cout << endl;
    } 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

河南萌新联赛2024第(六)场:郑州大学(ABCDFGHIL)

文章目录 写在前面A 装备二选一&#xff08;一&#xff09;思路code B 百变吗喽思路code C 16进制世界思路code D 四散而逃思路code F 追寻光的方向思路code G 等公交车思路code H 24点思路code I 正义从不打背身思路code L koala的程序思路code 河南萌新联赛2024第&#xff08…

Transformer总结(二):架构介绍(从seq2seq谈到Transformer架构)

文章目录 一、seq2seq应用介绍二、编码器解码器架构2.1 流程介绍2.2 原理说明 三、Transformer整体结构和处理流程3.1 Attention机制在seq2seq中的引入3.2 比较RNN与自注意力3.3 Transformer架构介绍3.4 处理流程3.4.1 编码器中处理流程3.4.2 解码器在训练阶段和预测阶段的差异…

Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明

系统要求 支持x64_64架构、aarch64架构&#xff08;需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9&#xff09;。 功能支持 Linux平台x64_64架构|aarch64架构RTMP直播推送SDK 音频编码&a…

UDP服务端、TCP的c/s模式

一、UDP服务端 socket bind //绑定 recvfrom ssize_t recvfrom(int sockfd, socket的fd void *buf, 保存数据的一块空间的地址 …

网络编程TCP与UDP

TCP与UDP UDP头&#xff1a; 包括源端口、目的地端口、用户数据包长度&#xff0c;检验和 数据。 typedef struct _UDP_HEADER {unsigned short m_usSourPort;    // 源端口号16bitunsigned short m_usDestPort;    // 目的端口号16bitunsigned short m_usLen…

一款B to B Connector的仿真结果与开发样品实测的结果对比

下面是一款B to B 连接器开发初期的CST仿真结果: 回波损耗 插入损耗 时域阻抗 开发样品出来后第三方测试机构的实测结果

Auto CAD 常用指令汇总 [持续更新]

简介 AutoCAD是由美国Autodesk公司开发的一款自动计算机辅助设计软件&#xff0c;广泛应用于建筑、工程、城市规划等多个领域。自1982年发布以来&#xff0c;AutoCAD不断进化&#xff0c;成为行业标准之一。它支持二维绘图和三维建模功能&#xff0c;用户可以精确绘制各种图形&…

BSCI(Business Social Compliance Initiative)验厂

在当今全球化的经济环境中&#xff0c;企业社会责任&#xff08;Corporate Social Responsibility, CSR&#xff09;已成为衡量企业成功与否的重要标尺之一。而BSCI&#xff08;Business Social Compliance Initiative&#xff09;验厂&#xff0c;作为国际间广泛认可的社会责任…

服务器Ubuntu22.04系统 使用dcocker部署安装ollama和搭配open_webui使用

服务器Ubuntu22.04系统 使用dcocker部署安装ollama和搭配open_webui使用 一、ubuntu和docker基本环境配置 1.更新包列表&#xff1a; 打开终端&#xff0c;输入以下命令&#xff1a; sudo apt-get updatesudo apt upgrade更新时间较长&#xff0c;请耐心等待 2. 安装docke…

[MOCO] Momentum Contrast for Unsupervised Visual Representation Learning

1、目的 无监督表示学习在自然图像领域已经很成功&#xff0c;因为语言任务有离散的信号空间&#xff08;words, sub-word units等&#xff09;&#xff0c;便于构建tokenized字典 现有的无监督视觉表示学习方法可以看作是构建动态字典&#xff0c;字典的“keys”则是从数据&am…

测评了几百款素材管理软件,新手设计师如何进行高效的素材管理?附教程

设计师朋友们&#xff0c;大家在日常工作中肯定积累了各种各样的素材&#xff0c;大家都保存在哪里呢&#xff1f;是散落在电脑磁盘里&#xff0c;还是用一个专门的素材管家管理呢&#xff1f;作为新手设计师&#xff0c;目前是在使用一款经典好用的素材管理软件—Eagle&#x…

Java学习_17_集合综合练习(待更新)

文章目录 前言一、自动点名器二、斗地主小游戏1、准备牌2、洗牌3、发牌4、理牌 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1a;BV17F411T7Ao 部分内容因没有学到&#xff0c;等待后续更新 一、自动点名器 /**** 点名器1&#xff0c;N个学生随机点名…

Edge-TTS:微软推出的,免费、开源、支持多种中文语音语色的AI工具[工具版]

Edge-TTS&#xff0c;由微软推出的这款免费、开源的AI工具&#xff0c;为用户带来了丰富多样的中文语音体验。它不仅支持多种中文语音语色&#xff0c;还能实现流畅自然的语音合成。Edge-TTS凭借其高度可定制化的特点&#xff0c;广泛应用于智能助手、语音播报、教育培训等领域…

商业软件许可证介绍|简单原理探究

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 引入话题 既然是商业软件&#xff0c;涉及到商业&#xff0c;那目的就是赚钱。 就拿IDEA举例&#x…

Linux系统中的常见操作命令

目录 命令总结&#xff1a; 一、目录处理命令 二、文件处理命令 三、权限管理命令 四、其它实用命令 命令总结&#xff1a; &#xff08;目录&#xff09; ls [参数] 目录、&#xff08;查看目录&#xff09;pwd、&#xff08;切换目录&#xff09;cd [目录路径]、&…

4.1栈和队列基本概念+经典OJ题

本篇博客来梳理栈和队列基本概念以及一道经典OJ题&#xff0c;题目已插入超链接&#xff0c;点击即可跳转~ 一、栈的相关概念 1&#xff0e;栈 一种特殊的线性表&#xff0c;只允许在固定的一端插入和删除元素&#xff0c;栈中的数据遵循后进先出原则 &#xff08;1&#x…

Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型

一、开闭原则 开闭原则是SOLID原则中的一个,指的是尽量使用开放扩展,关闭修改的设计原则。 在C++中如何使用开闭原则导出动态库,可以按照以下步骤进行: 定义抽象基类:定义动态库中的抽象基类,该基类应该封装可扩展的接口。 实现派生类:实现基类的派生类,这些派生类将封…

Vue 导航条+滑块效果

目录 前言代码效果展示导航实现代码导航实现代码导航应用代码前言 总结一个最近开发的需求。设计稿里面有一个置顶的导航条,要求在激活的项目下面展示个下划线。我最先开始尝试的是使用 after 的伪类选择器,直接效果一样,但是展示的时候就会闪现变化,感觉不够自然,参考了一…

继承(下)【C++】

文章目录 子类继承父类之后&#xff0c;子类的默认成员函数的变化构造函数编译器自动生成的构造函数程序员手动写的构造函数 拷贝构造编译器自动生成的拷贝构造函数程序员手动写的拷贝构造函数 赋值重载编译器自动生成的赋值重载程序员手动写的赋值重载 析构函数 继承与友元菱形…

vm安装mac虚拟机

vm安装mac虚拟机 简介实操 简介 教程&#xff1a;完全面向萌新的黑苹果安装教学&#xff1a;黑苹果安装从入门到入白&#xff0c;借助VMware虚拟机给实体机硬盘按照macOS黑苹果系统 实操 下载unlocker&#xff0c;之后运行vm就可以新建mac虚拟机了 新建一个没有选择镜像的…