蓝桥杯C++竞赛常用库函数介绍

文章目录

  • 前言
  • 一、二分查找
      • 1. 二分查找的前提
      • 2.binary_search函数
      • 3.lower_bound函数和upper_bound函数
      • 4.蓝桥杯例题
  • 二、最值查找
      • 1. min和max函数
      • 2.min_element和max_element函数
      • 3.nth_element函数
      • 4.蓝桥杯例题
  • 三、排序
      • 1.sort函数
      • 2.sort自定义比较函数,或lambda表达式(匿名函数)
      • 3.蓝桥杯例题
  • 四、全排列
      • 1.next_permutation函数
      • 2. prev_permutation函数
  • 五、大小写函数
      • 1.islower,isupper函数
      • 2.tolower,toupper函数
  • 六、其他库函数
      • 1.memset 函数
      • 2.swap 函数
      • 3.reverse 函数
      • 4.unique 函数
  • 总结


前言

最近开始准备蓝桥杯C++组的比赛了,是在自己学习过程中的记录,也分享给大家! 一些蓝桥杯C++竞赛常用库函数!


一、二分查找

1. 二分查找的前提

1.数只能对数组进行二分查找
2.这个数组中的元素只能是单调
3.一般是单调递减,单调递增也行(需修改比较函数)

2.binary_search函数

std::binary_search 函数定义在 头文件中,用于在已排序的序列(数组或容器)中查找特定的元素,通过二分查找来确定序列中是否存在目标元素,返回bool值
二分查找的时间复杂度为 O(log n),其中 n 是序列的大小。这是因为在每一次比较中,二分查找将搜索范围减半,直到找到目标值或者搜索范围为空为止。

//使用例程
#include <iostream>
#include <vector>
#include <algorithm> // 包含 <algorithm> 头文件int main() {std::vector<int> vec = {1, 3, 5, 7, 9};// 在有序序列中查找目标值 5if (std::binary_search(vec.begin(), vec.end(), 5)) {std::cout << "目标值 5 存在于序列中" << std::endl;} else {std::cout << "目标值 5 不存在于序列中" << std::endl;}return 0;
}

3.lower_bound函数和upper_bound函数

lower_bound(st,ed,x)返回地址[st,ed)中第一个大于等于x的元素的地址(迭代器)。
upper_bound(st,ed,x)返回地址[st,ed)中第一个大于x的元素的地址(迭代器)。

//例子
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 2, 3, 3, 3, 5};// 使用 lower_bound 查找第一个大于等于 3 的位置auto lower = std::lower_bound(vec.begin(), vec.end(), 3);std::cout << "lower_bound: " << std::distance(vec.begin(), lower) << std::endl;//std::distance(vec.begin(), lower) 是一个 C++ 标准库中的算法函数//用于计算两个迭代器之间的距离//vec.begin() 是容器 vec 的起始迭代器//lower 是 std::lower_bound 函数返回的迭代器,指向第一个大于等于目标值的位置。//等价于lower - vec.begin() // 使用 upper_bound 查找第一个大于 3 的位置auto upper = std::upper_bound(vec.begin(), vec.end(), 3);std::cout << "upper_bound: " << std::distance(vec.begin(), upper) << std::endl;return 0;
}

4.蓝桥杯例题

在这里插入图片描述

二、最值查找

1. min和max函数

std::min 和 std::max 是 C++ 标准库中的两个算法函数,用于返回两个值中的最小值和最大值。它们在 <algorithm> 头文件中声明。时间复杂度为 O(n)

#include <iostream>
#include <algorithm>int main() {int a = 10;int b = 20;// 返回两个值中的较小值int min_val = std::min(a, b);std::cout << "最小值:" << min_val << std::endl;// 返回两个值中的较大值int max_val = std::max(a, b);std::cout << "最大值:" << max_val << std::endl;//也可以返回一个列表中最大最小的值,用大括号{}括起来std::cout << "列表中的最大值:" << std::max({1, 2, 3, 4, 5}) << std::endl;return 0;
}

2.min_element和max_element函数

std::min_element 和 std::max_element 是 C++ 标准库中的两个算法函数,用于在容器中查找最小值和最大值对应的迭代器。它们在 <algorithm> 头文件中声明。时间复杂度为 O(n)
注意它返回的是迭代器,要的到返回的值需要*()

std::min_element(first, last)
std::max_element(first, last)
first 和last:表示要查找的范围的起始和结束迭代器(包含 first,但不包含 last)。[first, last)

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};// 返回容器中的最小值对应的迭代器auto min_it = std::min_element(vec.begin(), vec.end());std::cout << "最小值:" << *min_it << std::endl;// 返回容器中的最大值对应的迭代器auto max_it = std::max_element(vec.begin(), vec.end());std::cout << "最大值:" << *max_it << std::endl;return 0;
}

3.nth_element函数

std::nth_element 是 C++ 标准库中的一个算法函数,用于对容器中的元素进行部分排序,使得指定位置的元素处于排序后的正确位置。它在 <algorithm> 头文件中声明。

std::nth_element (first, nth, last)
std::nth_element 函数对范围 [first, last) 中的元素进行部分排序,使得迭代器 nth 指向的元素处于排序后的正确位置。
换句话说,nth 之前的元素都不大于 nth位置的元素,nth 之后的元素都不小于 nth 位置的元素。但是,nth 位置的元素不一定是整个范围中的第 nth 小的元素。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};// 将容器中的第5个元素置于正确的位置 ,排序后的容器第五个是正确位置的std::nth_element(vec.begin(), vec.begin() + 4, vec.end());// 输出排序后的结果std::cout << "第5个元素:" << vec[4] << std::endl;std::cout << "排序后的容器:" << std::endl;for (const auto& elem : vec) {std::cout << elem << " ";  //}std::cout << std::endl;return 0;
}

在这里插入图片描述

4.蓝桥杯例题

在这里插入图片描述

三、排序

1.sort函数

std::sort 是 C++ 标准库中的一个算法函数,用于对容器中的元素进行排序。它在 <algorithm> 头文件中声明。
first 和 last:表示要排序的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::sort 函数对范围 [first, last) 中的元素执行排序操作。默认情况下,它使用 < 运算符来比较元素的大小。如果需要自定义排序规则,可以提供一个比较函数或者 lambda 函数作为额外参数。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6};// 对容器中的元素进行排序std::sort(vec.begin(), vec.end());// 输出排序后的结果std::cout << "排序后的容器:" << std::endl;for (const auto& elem : vec) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

2.sort自定义比较函数,或lambda表达式(匿名函数)

如果需要自定义排序规则,可以通过提供一个比较函数或者 lambda 函数来告诉 std::sort 函数如何进行排序。

#include <iostream>
#include <vector>
#include <algorithm>// 自定义比较函数,按照元素的绝对值进行排序
bool compareAbsoluteValue(int a, int b) {return std::abs(a) < std::abs(b);
}int main() {std::vector<int> vec = {3, -1, 4, -6, 5, 9, -2, 6};// 使用自定义比较函数对容器中的元素进行排序std::sort(vec.begin(), vec.end(), compareAbsoluteValue);/* lambda表达式(匿名函数)std::sort(vec.begin(), vec.end(), [](int a, int b) {return std::abs(a) < std::abs(b);});*/// 输出排序后的结果std::cout << "排序后的容器:" << std::endl;for (const auto& elem : vec) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

3.蓝桥杯例题

在这里插入图片描述

四、全排列

1.next_permutation函数

std::next_permutation 是 C++ 标准库中的一个算法函数,用于生成给定序列的下一个排列。它在 <algorithm> 头文件中声明。

bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);
first 和 last:表示要处理的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::next_permutation 函数会重新排列范围 [first, last) 中的元素,生成当前排列的下一个排列。如果存在下一个排列,则函数返回 true,否则返回 false。如果 first 和 last 之间的元素已经按字典序降序排列(即当前排列是最后一个排列),那么函数将重新排列这些元素为第一个排列,并返回 false。

#include <iostream>
#include <vector>
#include <algorithm> // 包含 next_permutation 函数int main() {std::vector<int> vec = {1, 2, 3};// 打印初始排列std::cout << "初始排列: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;// 生成并打印下一个排列,直到没有下一个排列为止while (std::next_permutation(vec.begin(), vec.end())) {std::cout << "下一个排列: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;}return 0;
}

2. prev_permutation函数

std::prev_permutation 是 C++ 标准库中的一个算法函数,用于生成给定序列的上一个排列。它在 <algorithm> 头文件中声明。

bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
first 和 last:表示要处理的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::prev_permutation 函数会重新排列范围 [first, last) 中的元素,生成当前排列的上一个排列。如果存在上一个排列,则函数返回 true,否则返回 false。如果 first 和 last 之间的元素已经按字典序升序排列(即当前排列是第一个排列),那么函数将重新排列这些元素为最后一个排列,并返回 false。

#include <iostream>
#include <vector>
#include <algorithm> // 包含 prev_permutation 函数int main() {std::vector<int> vec = {3, 2, 1};// 打印初始排列std::cout << "初始排列: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;// 生成并打印上一个排列,直到没有上一个排列为止while (std::prev_permutation(vec.begin(), vec.end())) {std::cout << "上一个排列: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;}return 0;
}

五、大小写函数

1.islower,isupper函数

islower 和 isupper 是 C++ 标准库中的字符处理函数,用于检查字符是否为小写字母和大写字母。它在 <cctype> 头文件中声明。

int islower(int c);
c:表示要检查的字符,通常以整数形式传入。
islower 函数用于检查字符 c是否为小写字母。如果 c 是小写字母,则返回非零值(通常为 1),否则返回 0。

int isupper(int c);
c:表示要检查的字符,通常以整数形式传入。
isupper 函数用于检查字符 c是否为大写字母。如果 c 是大写字母,则返回非零值(通常为 1),否则返回 0。

#include <iostream>
#include <cctype> // 包含 islower 函数int main() {char c = 'a';// 检查字符 c 是否为小写字母if (islower(c)) {std::cout << c << " 是小写字母" << std::endl;} else {std::cout << c << " 不是小写字母" << std::endl;}// 检查字符 c 是否为大写字母if (isupper(c)) {std::cout << c << " 是大写字母" << std::endl;} else {std::cout << c << " 不是大写字母" << std::endl;}return 0;
}

2.tolower,toupper函数

tolower 和 toupper 是 C++ 标准库中的字符处理函数,用于将字符转换为小写和大写形式。它在 <cctype> 头文件中声明。

int tolower(int c);
c:表示要转换的字符,通常以整数形式传入。
tolower 函数用于将字符 c 转换为小写形式。如果c 是大写字母,则返回相应的小写字母;否则,返回 c 自身。
int toupper(int c);
c:表示要转换的字符,通常以整数形式传入。
toupper 函数用于将字符 c 转换为大写形式。如果 c是小写字母,则返回相应的大写字母;否则,返回 c 自身。

#include <iostream>
#include <cctype> // 包含 tolower 函数int main() {char c = 'A';char d = 'b';// 将字符 c 转换为小写形式char lowercase_c = tolower(c);std::cout << "字符 " << c << " 转换为小写形式为 " << lowercase_c << std::endl;// 将字符 d 转换为大写形式char uppercase_d = toupper(d);std::cout << "字符 " << d << " 转换为大写形式为 " << uppercase_d << std::endl;return 0;
}

六、其他库函数

1.memset 函数

memset 是 C/C++ 标准库中的一个函数,用于将一段内存区域的内容设置为指定的值。它在 <cstring> 头文件中声明。

memset 函数将指针 ptr 开始的连续 num 个字节的内存内容都设置为 value。
void* memset(void* ptr, int value, size_t num);
ptr:表示指向要填充的内存区域的指针。
value:表示要设置的值,以整数形式传入。
num:表示要设置的字节数。

#include <iostream>
#include <cstring> // 包含 memset 函数int main() {char str[] = "Hello, world!";int size = sizeof(str);// 将 str 数组的内容全部设置为 'A'memset(str, 'A', size);std::cout << str << std::endl; // 输出 "AAAAAAAAAAAAAA"return 0;
}

2.swap 函数

std::swap 是 C++ 标准库中的一个函数模板,用于交换两个值。它在 <algorithm> 头文件中声明。
std::swap 函数用于交换 a 和 b 两个值。它可以用于任何数据类型,包括基本数据类型(如整数、浮点数)和自定义类型(如类对象)。

#include <iostream>
#include <algorithm> // 包含 swap 函数int main() {int a = 10;int b = 20;// 交换 a 和 b 的值std::swap(a, b);std::cout << "a: " << a << std::endl; // 输出 "20"std::cout << "b: " << b << std::endl; // 输出 "10"return 0;
}

3.reverse 函数

std::reverse 是 C++ 标准库中的一个算法函数,用于反转容器中元素的顺序。它在 <algorithm> 头文件中声明。

void reverse(BidirectionalIterator first, BidirectionalIterator last);
first 和 last:表示要反转的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::reverse 函数用于反转范围 [first, last) 中的元素的顺序。它逆序地重新排列容器中的元素,即将第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,以此类推,直到中间位置。

#include <iostream>
#include <vector>
#include <algorithm> // 包含 reverse 函数int main() {std::vector<int> vec = {1, 7, 3, 6, 5};// 反转容器中的元素顺序std::reverse(vec.begin(), vec.end());// 输出反转后的结果std::cout << "反转后的容器:" << std::endl;for (const auto& elem : vec) {std::cout << elem << " ";  //5 6 3 7 1}std::cout << std::endl;return 0;
}

4.unique 函数

std::unique 是 C++ 标准库中的一个算法函数,用于移除容器中相邻重复的元素,并返回指向新的逻辑结尾的迭代器。它在 <algorithm> 头文件中声明。

ForwardIterator unique(ForwardIterator first, ForwardIterator last);
first 和 last:表示要处理的范围的起始和结束迭代器(包含 first,但不包含 last)。
std::unique 函数用于移除范围 [first, last) 中相邻重复的元素,只保留每个不重复元素的第一个出现,并返回一个指向新的逻辑结尾的迭代器,指向不重复元素的下一个位置。

#include <iostream>
#include <vector>
#include <algorithm> // 包含 unique 函数int main() {std::vector<int> vec = {1, 2, 2, 3, 6, 3, 3, 6, 6, 4, 5, 5};// 移除容器中相邻重复的元素auto new_end = std::unique(vec.begin(), vec.end());// 输出处理后的容器内容std::cout << "处理后的容器:" << std::endl;for (auto it = vec.begin(); it != new_end; ++it) {std::cout << *it << " "; //1 2 3 6 3 6 4 5}std::cout << std::endl;return 0;
}

总结

以上就是本章的介绍,唐怡佳继续加油!也希望大家都能取得好的成绩!

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

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

相关文章

流量分析——陇剑杯 2021【签到、jwt】

目录 签到1、攻击者正在进行的可能是什么协议的网络攻击 jwt1、该网站使用了______认证方式。前置知识&#xff1a;解&#xff1a; 2、黑客绕过验证使用的jwt中&#xff0c;id和username是3、黑客获取webshell之后&#xff0c;权限是什么4、黑客上传的恶意文件文件名是5、黑客在…

Sora没用上!国产AI创作恐怖电影:《生化危机:重生》下

Sora没用上&#xff01;国产AI创作恐怖电影&#xff1a;《生化危机&#xff1a;重生》下 丧尸围城&#xff0c;世界沦陷&#xff0c;爱丽丝是拯救这个世界的最后一剂解药&#xff0c;然而。。。 《生化危机&#xff1a;重生》&#xff08;下&#xff09;&#xff1a;在战斗的最…

物麒平台自定义事件代码修改流程

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送蓝牙音频&#xff0c;DSP音频项目核心开发资料, 1 配置工具对应关系 2 事件处理 3 事件定义 4

微服务远程调用Feign

目录 RPC概述 什么是Feign&#xff1f; Ribbon&Feign对比 Feign的设计架构 Spring Cloud Alibaba快速整合Feign Spring Cloud Feign扩展 日志配置 契约配置 通过拦截器实现参数传递 自定义拦截器实现认证逻辑 超时时间配置 RPC概述 微服务之间如何方便优雅的实…

来分析两道小题

一、源码 二、分析 首先它会接两个参数一个是id一个是ps&#xff0c;传递的话会包含一个flag.php&#xff0c;然后数据库连接&#xff0c;之后传递过滤&#xff0c;然后查询&#xff0c;如果查到了就会取id&#xff0c;取出来看是不是跟adog一样&#xff0c;如果是它告诉你账号…

算法------(12)Trie树(字典树)

例题&#xff1a;&#xff08;1&#xff09;Acwing 835. Trie字符串统计 Trie树是一个可以高效存储查询字符串的数据结构。将一个字符串的每一个字符作为一个根节点&#xff0c;从字符串头到字符串尾连接起来。因此我们可以把每一个字符串存储为一个节点&#xff0c;记录其子节…

C 嵌入式系统设计模式 09:硬件适配器模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之二&…

性能测试的几个指标范围(CPU,内存,IO,网络)

性能测试中&#xff0c;对服务端的指标监控也是很重要的一个环节。通过对各项服务器性能指标的监控分析&#xff0c;可以定位到性能瓶颈。 后端性能指标有 CPU&#xff0c;内存&#xff0c;网络&#xff0c;jvm&#xff0c;I/O 等等 分析思路 整体系统 CPU 利用率 内存利用…

【论文精读】Diffusion Transformer(DiT)

摘要 以往的Diffusion模型主要以卷积UNet作为主干网络&#xff0c;本文发现U-Net的归纳偏差对Diffusion模型的性能并不是至关重要的&#xff0c;可以用Transformer等取代。通过利用其他视觉方向成熟的Transformer方案和训练方法&#xff0c;Diffusion模型可以从这些架构中获益&…

一篇文章搞懂CDN加速原理

目录 一、什么是CDN CDN对网络的优化作用主要体现在以下几个方面&#xff1a; 二、CDN工作原理 CDN网络的组成元素&#xff1a; 三、名词解释 3.1 CNAME记录&#xff08;CNAME record&#xff09; 3.2 CNAME域名 3.3 DNS 3.4 回源host 3.5 协议回源 一、什么是CDN CD…

【SpringBoot3】Spring Security 常用配置总结

注&#xff1a;本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 相关文章 【SpringBoot3】Spring Security 核心概念 【SpringBoot3】Spring Security 常用注解 【SpringBoot3】Spring Security 详细使用实例&#xff08;简单使用、JWT模式&#xff09; 【SpringBoot3】…

【MATLAB GUI】 4. 坐标区和表

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 文章目录 坐标区表 坐标区 任务要求设计一个图像显示界面&#xff0c;根据选定的周期做出相应的sin函数图像 使用坐标区、弹出式菜单、普通按钮设计页面&#xff0c;弹出式菜单string设置为1、2、3、4代…

【Linux系统化学习】深入理解匿名管道(pipe)和命名管道(fifo)

目录 进程间通信 进程间通信目的 进程间通信的方式 管道 System V IPC&#xff08;本地通信&#xff09; POSIX IPC&#xff08;网络通信&#xff09; 管道 什么是管道 匿名管道 匿名管道的创建 匿名管道的使用 匿名管道的四种情况 匿名管道的五种特性 命名管道 …

iOS总体框架介绍和详尽说明

iOS总体框架介绍和详尽说明 一、iOS是什么&#xff1f;1.iOS简述2.iOS界面 二、iOS总体框架介绍和详尽说明1.iOS的框架层级1. 核心操作系统层&#xff08;Core OS layer&#xff09;1.1 Accelerate Framework1.2 Core Bluetooth Framework1.3 External Accessory Framework1.4 …

【wails】(4):使用wails做桌面应用开发,整合chatgpt-web项目做前端,进行本地开发,web端也可以连调,使用websocket实现

1&#xff0c;视频地址 【wails】&#xff08;4&#xff09;&#xff1a;使用wails做桌面应用开发&#xff0c;整合chatgpt-web项目做前端&#xff0c;进行本地开发&#xff0c;web端也可以连调&#xff0c;使用websocket实现 2&#xff0c;演示效果 启动先是报500 错误&#…

Charles小程序抓包(安卓版)

微信小程序/公众号抓包的主流方式 目前有以下几种&#xff1a; 1、WindowsBurpProxifier&#xff08;配置困难&#xff0c;数据包卡顿) 2、Burp安卓模拟器&#xff08;模拟器卡顿&#xff09; 3、BurpCharles&#xff08;本文测试&#xff0c;抓包完整&#xff0c;放包流畅…

防御保护第八、九、十、十一天笔记

一、内容安全 1、DFI和DPI技术 --- 深度检测技术 DPI是一种基于应用层的流量检测和控制技术&#xff0c;它会对流量进行拆包&#xff0c;分析包头和应用层的内容&#xff0c;从而识别应用程序和应用程序的内容。这种技术增加了对应用层的分析&#xff0c;识别各种应用&#xf…

【2024.02.22】定时执行专家 V7.0 发布 - TimingExecutor V7.0 Release - 龙年春节重大更新版本

目录 ▉ 新版本 V7.0 下载地址 ▉ V7.0 新功能 ▼2024-02-21 V7.0 - 更新日志▼ ▉ V7.0 新UI设计 ▉ 新版本 V7.0 下载地址 BoomWorks软件的最新版本-CSDN博客文章浏览阅读10w次&#xff0c;点赞9次&#xff0c;收藏41次。▉定时执行专家—毫秒精度、专业级的定时任务执行…

Jenkins2.426邮件通知配置

之前安装的jenkins出现问题了&#xff0c;重新装了jenkins&#xff0c;需要重新配置&#xff1a;Maven&#xff0c;JDK&#xff0c;Allure报告&#xff0c;邮件通知&#xff0c;Extended E-mail Notification等 配置Maven&#xff0c;JDK参考&#xff1a;CICD集合(四):Jenkins…

vue中使用wangEditor富文本编辑器

jsd-2306-vue-01: 教学项目教学项目教学项目教学项目教学项目 2306-vue-baking-teacher: 教学项目教学项目教学项目教学项目 一、脚手架工程中使用富文本编辑器wangEditor 1.通过以下命令 安装wangEditor npm i wangeditor -S 2.在main.js文件中添加以下配置信息 //引入wa…