(蓝桥杯C/C++)——常用库函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、 二分查找

1.二分查找的前提

2.binary_ search函数

3.lower_bound和upper_bound

二、排序

1.sort概念

2.sort的用法

3.自定义比较函数

三、全排列

1.next permutation函数

2.prev_permutation()函数

四、最值查找

1.min和max函数

2.min element和max element

3.nth_element函数

五、大小写转换

1.islower/isupper函数

2.tolower/toupper函数

3.ascii码

六、其他库函数

1.memset()

2.swap()

3.reverse()

4.unique()



一、 二分查找

1.二分查找的前提

库函数只能对数组进行二分查找,
对一个数组进行二分查找的前提是这个数组中的元素是单调的,一般为单调不减,当然如果是单调不增也可以(需要修改比较函数)

例如:
[1,5,5.9,18]是单调的
[1,9,9,7,15]不是单调的
[9,8,8.7,7,1]是单调的

2.binary_ search函数

binary_ search是C++标准库中的一个算法函数,用于在已排序的序列(例如数组容器中查找特定元素。

容器:C++标准模板库(STL)提供了一系列预定义的容器类,这些容器类是用来存储和管理对象的集合。
它通过二分查找算法来确定序列中是否存在目标元素。
函数返回一个bool值,表示目标元素是否存在于席列中。

如果需要获取找到的元素的位置,可以使用
lower_ bound函数或upper_ bound函数

代码如下(示例):

vector<int> numbers = {1, 3, 5, 7};

int a = 5;

//使用binary_ search查找目标元素

bool found = binary_ search(numbers.begin(), numbers.end(),a);

if (found)

      {

        cout << "a element " << a << "found." << endl;

     }

        else 

          {

            cout << "a element "<< a << " not found." << endl;

         }

3.lower_bound和upper_bound

前提:数组必须为非降序。
如果要在非升序的数组中使用,可以通过修改比较函数实现(方法与sort自定义比较函数似)

lower_ bound(st,ed,x)返回地址[st,ed)中第一个大于等于x的元素的地址。

//st(起始地址)/ed(结束地址)

upper_ bound(st,ed,x)返回地址[st,ed)中第一个大于x的元素的地址。

//地址-首地址=下标

如果不存在则返回最后一个元素的下一个位置,在vector中即end()。

代码如下(示例):

//初始化v

vector<int> v = {5, 1, 3, 7, 9};

sort ( v.begin(), v.end () );

for (auto &i : v)

cout << i << ' ' :

cout << '\n' ;

//找到数组中第一个大于等于5的元素位置

cout << (lower_bound(v.begin(), v.end(), 5) - v.begin()) << '\n';

二、排序

1.sort概念

sort函数包含在头文件<algorithm>中:在使用前需要#include<algorithm>或使用万能头文件。sort是C++标准库中的一个函数模板,用于对指定范围内的元素进行排序。
sort算法使用的是快速排序(QuickSort)或者类似快速排序的改进算法,具有较好的平均时间复杂度,一般为O(nlogn)。

2.sort的用法

sort(起始地址, 结束地址的下一位, *比较函数);

代码如下(示例):

int a[100];

int n;                

    //读取数组大小

cin >> n;      

     //读取元素

for(int i = 1;i <= n; ++i)

cin >> a[i];

    //对数组进行排序

sort(a + 1, a + n + 1);

    //输出

for(int i = 1;i <= n; ++i)     

  //可以替换成  for(auto i : v)

cout << a[i] << ' ';

3.自定义比较函数

sort默认使用小于号进行排序,如果想要自定义比较规则,
可以传入第三个参数,可以是函数或lambda表达式。

代码如下(示例):

bool cmp(const int &u, const int &v)

{

  return u > v;

}

int main()

{

   ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

  //初始化v

vector<int> v = {5, 1, 3, 9};

  //对数组进行排序,降序排列

sort(v.begin(), v.end(), cmp);

  //输出

for(int i = 0,i < v.size(); ++ i)

cout << v[i] <<' ';  

输出:  9 5 3 1

结构体可以将小于号重载后进行排序,当然用前面的方法
也是可行的。

代码如下(示例):

struct NO

{

   int u, v;

   bool operator < (const No &m)const

   {

       //以u为第一关键字,v为第二关键字排序

        return u == m.u ? v < m.v : u < m.u;

    }

三、全排列

1.next permutation函数

next permutation函数用于生成当前序列的下一个排列。它按照字典序对序列进行重新排列,如果存在下一个排列,则将当前序列更改为下一个排列,并返回true;如果当前序列已经是最后一个排列,则将序列更改为第一个排列,并返回false。

代码如下(示例):

vector<int> nums = {1, 2, 3};

cout << "initial permutation: ";

for (int num : nums)

  {

       cout << num << " ";

 }

cout << endl;

//生成下一个排列

while(next_permutation(nums.begin(), nums.end())

{

        cout << "next_permutation: ";

        for (int num :nums)

              cout << num << " ";

        {

      cout << endl;

}

输出:

123
132
213
231
312
321

2.prev_permutation()函数

prev_permutation函数与next permutation 函数相反,它用于生成当前序列的上一个排列。它按照字典序对序列进行重新排列,如果存在上一个排列,则将当前序列更改为上一个排列,并返回true;如果当前序列已经是第一个排列,则将序列更改为最后一个排列,并返回false。

代码如下(示例):

vector<int> nums2 = {3, 2, 1};

cout << "initial permutation: ";

for (int num : nums2)

  {

       cout << num << " ";

 }

cout << endl;

//生成上一个排列

while(prev_permutation(nums2.begin(), nums2.end())

{

        cout << "prev_permutation: ";

        for (int num : nums2)

              cout << num << " ";

        {

      cout << endl;

}

输出:

321
312
213
213
132
123

四、最值查找

1.min和max函数
 

min(a,b)返回a和b中较小的那个值,只能传入两个值,或传入一个列表。例如:
min(3, 5)=3
min({1,2,3,4})=1
max(a,b)返回a和b中较大的那个值,只能传入两个值,或传入一个列表。例如:
max(7,5)=7
min({1,2, 3,4})=4
时间复杂度为O(1),传入参数为数组时时间复杂度为0(n),n为数组大小。
min,max函数是在取最值操作时最常用的操作。

2.min element和max element

min_element(st,ed)返回地址[st,ed)中最小的那个值的地址(迭代器),传入参数为两个地址或迭代器。
max_element(st,ed)返回地址[st,ed)中最大的那个值的地址(迭代器),传入参数为两个地址或迭代器。
时间复杂度均为O(n),n为数组大小(由传入的参数决定)

代码如下(示例):

//初始化v
vector <int> v = (5,1,3,9,11};
//输出最大的元素,*表示解引用,即通过地址(迭代器)得到值

cout << ( *max_element(v. begin,  v.end()) << '/n';

输出:11

3.nth_element函数

nth element(st, k, ed)
进行部分排序,返回值为void()
传入参数为三个地址或迭代器。其中第二个参数位置的元素将处于正确位置,其他位置元素的顺序可能是任意的,但前面的都比它小,后面的都比它大。时间复杂度O(n)。

代码如下(示例):

//初始化

vector<int>v={5,1,7,3, 10,18, 9};

//输出最大的元素,*表示解引用,即通过地址(达代器)得到值

nth_ element(v.begin(),v.begin()+ 3,v.end());

//这里v[3]的位置将会位于排序后的位置,其他的任意

for(auto &i :v)

cout <<  i  <<  " ";、


输出:3 1 5 7 9 18 10

五、大小写转换

1.islower/isupper函数

islower和isupper是C++标准库中的字符分类函数,用于检查一个字符是否为小写字母或大写字母islower和isupper函数需要包含头文件<cctype>,也可用方能头包含。函数返回值为bool类型。

代码如下(示例):

char ch1='A ';

char ch2 ='b';
//使用 islower 函数判断字符是否为小写字母

if(islower(ch1))

{

          cout << ch1 << " is a lowercase letter." << endl;

}

             else

           {
                     cout << ch1 << "is not a lowercase letter." << endl;

           }


//使用 isupper 函数判断字符是否为大写字母

if (isupper(ch2))

{

          cout << ch2 << " is an uppercase letter."<< endl;

 }

       else

        {
        cout << ch2 << "is not an uppercase letter." << endl;
        }

2.tolower/toupper函数

tolower(charch)可以将ch转换为小写字母,如果ch不是大写字母则不进
行操作。toupper()同理。

代码如下(示例):

char ch1 ='A';
char ch2= 'b';
//使用tolower 函数将字符转换为小写字母
char lowercaseCh1 = tolower(ch1);

cout << "Lowercase of " << ch1 << " is " << lowercasech1 << endl;
//使用toupper 所数将字符转换为大写字母
char uppercasech2 = toupper(ch2);
cout <<"Uppercase of "<< ch2 <<" is " << uppercasech2 << endl;

3.ascii码

在了解了ascii码后,我们可以通过直接对英文字母进行加减运算计算出其大小写的字符。
在ASCI码表中,大写字母的编码范围是65(A)到90(Z),而小写字母的编码范围是97(a”)到122(z)。根据这个规则,可以使用ASCII码表进行大小写转换。

代码如下(示例):

char ch='A';//大写字母

char convertedch;
if (ch >= 'A’ && ch <= 'z')

        { 

         //大写字母转换为小写字母

         convertedch =ch+32;
         cout << "converted character: " << convertedch << endl;

         }

              else if (ch>='a'88 ch<= 'z')

               {
               // 小写字母转换为大写字母
                convertedch=ch-32;

               cout << "converted character: " << convertedch << endl;
              }

                      else

                            {
                             cout << "Invalid character!"  << endl;

                            }

六、其他库函数

1.memset()

memset()是一个用于设置内存块值的函数它的原型定义在<cstring>头文件中,

函数的声明如下:
void* memset(void* ptr,int value, size t num);

memset0)函数接受三个参数:
1.ptr:指向要设置值的内存块的指针。
2.value:要设置的值,通常是一个整数。
3.num:要设置的字节数。

memset0函数将ptr指向的内存块的前num个字节设置为value的值。它返回一个指向ptr的指针。memset0函数通常用于初始化内存块,将其设置为特定的值。例如,如果要将一个整型数组的所有元素设置为0,可以使用memset0)函数如下
int arr[10];emset(arr,0,sizeof(arr));

在上述示例中,,memset(arr,0.sizeof(arr))将数组arr的所有元素设置为0,需要注意的是,memset()函数对于非字符类型的数组可能会产生未定义行为。在处理非字符类型的数组时,更好使用C++中的其他方法,如循环遍历来视memset会将每个byte设置为value。
 

2.swap()

swap(T&a,T&b)函数接受两个参数:
1.a:要交换值的第一个变量的引用
2.b:要交换值的第二个变量的引用

swap()函数通过将第一个变量的值存储到临时变量中,然后将第二个变量的值赋给第一个变量,最后将临时变量的值赋给第二个变量,实现两个变量值的交换。

swap()函数可以用于交换任意类型的变量,包括基本类型(如整数、浮点数等)和自定义类型(如结构体、类对象等)。

以下是一个示例,展示如何使用swap()函数交换两个整数的值:
int a= 10;int b= 20;std::swap(a, b);

3.reverse()

reverse()是一个用于反转容器中元素顺序的函数。它的原型定义在<algorithm>头文件中,函数的声明如下
template<class BidirIt>
void reverse(BidirIt first, BidirIt last);

reverse()函数接受两个参数:
1.first:指向容器中要反转的第一个元素的迭代器。

2.last:指向容器中要反转的最后一个元素的下一个位置的迭代器

reverse()函数将[first,last)范围内的元素顺序进行反转。也就是说,它会将[first,last)范围内的元素按相反的顺序重新排列。

reverse()函数可用于反转各种类型的容器,包括数组、向量、链表等。

以下是一个示例,展示如何使用reverse()函数反转一个整型向量的元素顺序:

代码如下(示例):

#include <iostream>

#include <vectar>

#include <algorith>

int main()

     {

         std::vector<int> vec = {1, 2, 3, 4, 5};

         std::reverse(vec.begin(), vec .end( ));
              for (int num : vec)

              {

               std::cout << num <<" ";

              }
              std::cout << std::endl;
              return 0;

              }

在上述示例中,std::reverse(vec.begin()vec.end())将整型向量vec中的元素顺序进行反转。最终输出的结果是54321。需要注意的是,reverse()函数只能用于一"向迭代器的容器,因为它需要能够向"后遍历容器中的元素。对于只支持单器的容器(如前向链表),无法使用rev函数进行反转。

4.unique()

unique()是一个用于去除容器中相邻重复元素的函数,它的原型定义在<algorithm>头文件中,

函数的声明如下
template<class ForwardIt>

ForwardIt unique(ForwardIt first, ForwardIt last);

unique(first, last)函数接受两个参数:
1.first:指向容器中要去重的第一个元素的迭代器,
2.last:指向容器中要去重的最后元素的下一个位置的迭代器

unique()函数将[first, last)范围内的相邻重复元素去除,并返回一指向去重后范围的尾后迭代器去重后的范围中只保留了第一个出现的元素,后续重复的元素都被移除。

unique()函数可用于去除各种类型的容器中的相邻重复元素,包括数组、向量、链表等。

以下是一个示例,展示如何使用unique()函数去除一个整型向量中的相邻重复元素:
int main()

    {

         std::vector<int> vec = {1, 1, 2, 2, 3, 3, 3.4, 4, 5)

         auto it = std::unique(vec.begin(), vec.end( ));

         vec.erase(it, vec.end());
         for (int num : vec)

          {
             std: :cout << num << "  ";
             std::cout << std::endl;
             return 0

    }

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

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

相关文章

软考:24年上半年选择题

软件测试的目的是降低风险&#xff0c;无法100%的证明被测对象的正确性。 数字孪生&#xff1a; EAI企业应用集成&#xff1a; 线性回归技术&#xff1a; 嵌入式系统实时特性&#xff1a; 计算机信息安全&#xff1a;最安全的是访问验证保护级&#xff0c;最不安全的是用…

【Linux】从零开始使用多路转接IO --- poll

碌碌无为&#xff0c;则余生太长&#xff1b; 欲有所为&#xff0c;则人生苦短。 --- 中岛敦 《山月记》--- 从零开始使用多路转接IO 1 前言1 poll接口介绍3 代码编写4 总结 1 前言 上一篇文章我们学习了多路转接中的Select&#xff0c;其操作很简单&#xff0c;但有一些缺…

系统架构设计师-未来信息综合技术(2)

一、机器人技术 森政弘与合田周平提出的:“机器人是一种具有移动性、个体性、智能性、通用性、半机械半人性、自动性、奴隶性等7个特征的柔性机器。” 从这一定义出发&#xff0c;森政弘又提出了用自动性、智能性、个体性、半机械半人性、通用性、移动性、信息性、柔性、有限性…

知识吾爱纯净版小程序系统 leibiao SQL注入漏洞复现(XVE-2024-30663)

0x01 产品简介 知识吾爱纯净版小程序系统是一款基于微信小程序平台开发的知识付费应用,旨在帮助用户快速建立自己的知识付费平台,实现支付变现和流量主收益。它提供了简洁明了的用户界面和良好的用户体验,同时注重用户隐私保护,确保用户信息的安全存储和传输。 0x02 漏洞…

CocoaPods安装步骤详解 - 2024

引言 CocoaPods的安装&#xff0c;如果有VPN就一直开启&#xff0c;会让整个流程非常顺畅。 在现代 iOS 开发中&#xff0c;依赖管理变得越来越重要&#xff0c;CocoaPods 成为开发者们首选的依赖管理工具。它不仅可以简化库的安装与更新&#xff0c;还能帮助开发者更高效地管…

【计网】深入理解NAT机制,内网穿透与内网打洞,代理服务

我没胆量犯错 才把一切错过 --- 林夕 《我对不起我》--- 一文了解NAT机制&#xff0c;代理服务&#xff0c;内网穿透 1 再谈 NAT 机制2 内网穿透与内网打洞3 代理服务器 1 再谈 NAT 机制 NAT机制我们在解决IP地址不足的问题中提到过。为了解决IP地址不足的问题&#xff0c;采…

Docker篇(安装容器)

目录 一、安装mysql容器 1. 拉取mysql镜像 2. 创建并运行容器 二、安装Tomcat容器 1. 拉取镜像 2. 创建并运行容器 三、安装Nginx容器 1. 拉取镜像 2. 创建并运行容器 四、安装Redis容器 1. 拉取镜像 2. 创建并运行容器 五、安装RabbitMQ 1. 拉取镜像 2. 创建并运…

App Inventor 2 列表显示框能否实现多选?

Q&#xff1a;列表显示框有没有办法做到多选的功能&#xff1f; // 问题分析 // AppInventor2列表显示框原生并没有多选功能&#xff0c;只能点击其中一项&#xff0c;然后触发“选择完成时”这个事件&#xff0c;那么有没有办法做到多选呢&#xff1f; // 问题思路 // 经过…

PropTypes 和 TypeScript 在 React 中的比较

文章目录 引言PropTypes什么是 PropTypes&#xff1f;如何使用 PropTypes优点缺点 TypeScript什么是 TypeScript&#xff1f;如何使用 TypeScript优点缺点 选择建议总结 引言 在 React 开发中&#xff0c;组件的可复用性和可维护性至关重要。为了确保组件接收到正确的 props&a…

进程间通信(命名管道 共享内存)

文章目录 命名管道原理命令创建命名管道函数创建命名管道 共享内存原理shmgetFIOK 代码应用&#xff1a;premsnattch 命名管道 用于两个毫无关系的进程间的通信。 原理 Linux文件的路径是多叉树&#xff0c;故文件的路径是唯一的。 让内核缓冲区不用刷新到磁盘中&#xff0c…

计算机毕业设计Hadoop+大模型旅游推荐系统 旅游景点推荐 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 开题报告 设计&#xff08…

一般无人机和FPV无人机的区别

文章目录 一般无人机的工作原理关键组件&#xff1a;一般无人机的应用领域一般无人机的操控体验 FPV无人机的工作原理关键组件&#xff1a;FPV无人机的应用领域FPV无人机的操控体验性能特点FPV无人机的性能特点 未来无人机发展方向和通信方式拓展 一般无人机的工作原理 一般无…

react基础之redux快速上手环境准备

文章目录 核心概念配置基础环境提交action传参异步状态操作redux调试-devtools配套工具 Redux 是一个状态管理库&#xff0c;通常与 React 一起使用&#xff0c;帮助开发者管理应用的全局状态。它的核心理念是将应用的状态存储在一个单一的、不可变的状态树中&#xff0c;并通过…

OAuth2.0 动态注册客户端

什么是 OAuth 2.0 客户端自动注册&#xff1f; OAuth 2.0 客户端注册通常是在授权服务器的管理界面或通过静态配置文件手动完成的。客户端自动注册是指应用在启动或运行过程中通过代码与 OAuth 2.0 授权服务器交互&#xff0c;自动注册并获取 client_id 和 client_secret 等必…

启纬科技发布6色无源电子纸手机壳InkaceE6

杭州启纬科技有限公司投稿:无源NFC技术的开创者和领导者,杭州启纬科技有限公司于北京时间2024年10月28号正式发布了面向iOS系统和安卓/鸿蒙系统的6色无源电子纸手机壳---InkaceE6系列产品及配套方案。 图1:手机壳高清图 图2:6色与3色、4色效果对比图,海边美女 启纬…

鸿蒙生态下开发挑战-鸿蒙低代码开发工具展望及优势

鸿蒙生态下开发挑战 在鸿蒙生态下开发时&#xff0c;开发者可能会遇到多方面的挑战&#xff0c;这些挑战主要涉及开发工具、技术难度、生态竞争以及市场定位等方面。以下是对这些挑战的详细分析&#xff1a; 一、开发工具不完善 尽管鸿蒙系统的开发工具DevEco Studio在逐步完…

CSS 超出一行省略号...,适用于纯数字、中英文

文本超出显示省略号... 代码&#xff1a; .ellipsis{ overflow: hidden; -webkit-line-clamp:1; text-overflow: ellipsis; display: -webkit-box; -webkit-box-orient: vertical; word-break: break-all; /** 纯数字、中英文都适用 */ }

vscode markdown-image 图片粘贴自动上传到本地目录设置

.vscode/settings.json文件内容 {"markdown-image.base.fileNameFormat": "${hash}-${YY}${MM}${DD}-${HH}${mm}${ss}","markdown-image.local.path": "./images","markdown-image.base.uploadMethod": "Local",…

java设计模式之结构型模式(7种)

结构型模式 描述如何将类或者对象按某种布局组成更大的结构。它分为结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者通过组合或聚合来组合对象。 分为7种&#xff1a;代理模式、适配器模式、装饰者模式、桥接模式、外观模式、组合模式、…

Java序列化与反序列化

文章目录 一、Java序列化和反序列化1、序列化和反序列化的含义和用途序列化主要使用场景反序列化漏洞出现的原因 下一期 一、Java序列化和反序列化 1、序列化和反序列化的含义和用途 Java对象&#xff08;存在于内存&#xff09;———序列化——>>字符串/二进制流&…