STL-函数对象、谓词、常用算法

函数对象

函数对象概念

重载函数调用操作符的类,其对象常称为函数对象

函数对象使用重载的()时,行为类似函数调用,也叫仿函数

本质:

函数对象(仿函数)是一个,不是一个函数

函数对象使用

特点:

  • 函数对象在使用时,可以想普通函数那样调用,可以有参数,可以有返回值
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
  • 函数对象可以作为参数传递
//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
class MyAdd
{
public:int operator()(int a, int b){return a + b;}
};
//函数对象超出普通函数的概念,函数对象可以有自己的状态
class MyPrint
{
public:MyPrint(){this->m_Count = 0;}void operator()(string test){cout << test << endl;m_Count++;}int m_Count;
};
//函数对象可以作为参数传递
void doPrint(MyPrint& mp, string test)
{mp(test);
}
void test01()
{//函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值MyAdd add;cout << add(10, 20) << endl;//函数对象超出普通函数的概念,函数对象可以有自己的状态MyPrint myPrint;myPrint("hello world");myPrint("hello world");myPrint("hello world");myPrint("hello world");myPrint("hello world");cout << "打印次数:" << myPrint.m_Count << endl;//函数对象可以作为参数传递doPrint(myPrint, "hello c++");
}

谓词

谓词概念

返回bool类型仿函数称为谓词

如果operator()接受一个参数,那么叫做一元谓词

如果operator()接受两个参数,那么叫做二元谓词

//返回bool类型的仿函数称为谓词
//一元谓词 - 大于5
class greaterFive
{
public:bool operator()(int val){return val > 5;}
};void test01()
{vector<int>v;for (int i = 0; i < 10; ++i){v.push_back(i);}vector<int>::iterator it = find_if(v.begin(), v.end(), greaterFive());if (it == v.end()){cout << "没找到" << endl;}else{cout << "找到大于5的数为:" << *it << endl;}
}

二元谓词之前已经提过,排序的方式修改

内建函数对象

内建函数对象意义

STL内建了一些函数对象

分类:

算术仿函数

关系仿函数

逻辑仿函数

用法:

这些仿函数所产生的对象,用法和一般函数完全相同

使用内建函数对象,需要引入头文件#include<fucntional>

算术仿函数

功能描述:

实现四则运算

其中negate是一元运算,其他都是二元运算

仿函数类型:

void test01()
{negate<int>n;cout<<n(30)<<endl;plus<int>p;cout<<p(10, 20)<<endl;
}

注意:使用内建函数对象,需要引入头文件#include<fucntional>

关系仿函数

功能描述:

实现关系对比

仿函数原型:

void printVector(vector<int>& v)
{for (vector<int>::iterator it = v.begin(); it != v.end();++it){cout << *it << " ";}cout << endl;
}
class Larger
{
public:bool operator()(int num1, int num2){return num1 > num2;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(30);v.push_back(40);v.push_back(20);printVector(v);sort(v.begin(), v.end());printVector(v);//从大到小排序// 方法1. 自定义仿函数// sort(v.begin(), v.end(), Larger());//方法2. 内建关系仿函数sort(v.begin(), v.end(), greater<int>());printVector(v);
}

关系仿函数中最常用的就是greater<>大于

逻辑仿函数

实现逻辑运算

函数原型:

class print02
{
public:void operator()(bool num){cout << num << " ";}
};
class Transform
{
public:int operator()(int num){return num+1;}
};
void test01()
{vector<bool>v;v.push_back(true);v.push_back(false);v.push_back(true);v.push_back(true);for_each(v.begin(), v .end(), print02());cout << endl;//搬运vector<bool>v2; //目标容器v2.resize(v.size()); //目标容器,需要提前开辟空间transform(v.begin(), v.end(), v2.begin(), logical_not<int>());for_each(v2.begin(), v2.end(), print02());cout << endl;
}

STL-常用算法

  • 算法主要是由头文件<algorithm><functional><numeric>组成。
  • <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等
  • <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数
  • <functional>定义了一些模板类,用以声明函数对象。

常用遍历算法

for_each //遍历容器

transform //搬运容器到另一个容器中

for_each

函数原型:

//普通函数
void print01(int num)
{cout << num << " ";
}
//仿函数
class print02
{
public:void operator()(int num){cout << num << " ";}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(40);v.push_back(30);v.push_back(20);//遍历算法for_each(v.begin(), v.end(), print01);cout << endl;for_each(v.begin(), v.end(), print02());
}
transform

函数原型:

class Transform
{
public:int operator()(int num){return num+1;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(40);v.push_back(30);v.push_back(20);//搬运vector<int>v2; //目标容器v2.resize(v.size()); //目标容器,需要提前开辟空间transform(v.begin(), v.end(), v2.begin(), Transform());for_each(v2.begin(), v2.end(), print02());cout << endl;
}

常用查找算法

算法简介

find

功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()

函数原型:

void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(14);for_each(v.begin(), v .end(), print02());cout << endl;vector<int>::iterator it = find(v.begin(), v.end(), 20);if (it == v.end()){cout << "没有找到" << endl;}else{cout << "找到了:" << *it << endl;}
}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(const Person& p){if (this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};
void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 43);Person p4("tony", 38);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);Person pp("as", 32);vector<Person>::iterator it = find(v.begin(), v.end(), pp);if (it == v.end()){cout << "没找到" << endl;}else{cout << "找到了,姓名:" << it->m_Name << ",年龄:" << it->m_Age << endl;}
}
find_if

功能描述:

按条件查找元素

函数原型:

class greaterFive
{
public:bool operator()(int val){return val > 15;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(14);for_each(v.begin(), v .end(), print02());cout << endl;vector<int>::iterator it = find_if(v.begin(), v.end(), greaterFive());if (it == v.end()){cout << "没有找到" << endl;}else{cout << "找到了:" << *it << endl;}
}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(const Person& p){if (this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};
class greater20
{
public:bool operator()(const Person& p){return p.m_Age > 20;}
};
void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 43);Person p4("tony", 38);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);Person pp("as", 32);vector<Person>::iterator it = find_if(v.begin(), v.end(), greater20());if (it == v.end()){cout << "没找到" << endl;}else{cout << "找到了,姓名:" << it->m_Name << ",年龄:" << it->m_Age << endl;}
}
adjacent_find

查找相邻重复元素

函数原型:

void test01()
{vector<int>v;v.push_back(10);v.push_back(20);v.push_back(10);v.push_back(30);v.push_back(14);v.push_back(14);vector<int>::iterator it = adjacent_find(v.begin(), v.end());if (it == v.end()){cout << "未找到" << endl;}else{cout << "已找到:" << *it << endl;}  
}
binary_search

查找指定元素是否存在

函数原型:

void test01()
{vector<int>v;for (int i = 0; i < 10; ++i){v.push_back(i);}bool judge = binary_search(v.begin(), v.end(), 4);if (judge){cout << "找到了" << endl;}else{cout << "未找到" << endl;}
}

注意:二分查找法查找效率虽然高,但查找的容器中元素必须是有序序列

count

统计元素个数

函数原型:

void test01()
{vector<int>v;v.push_back(12);v.push_back(34);v.push_back(32);v.push_back(4);v.push_back(12);v.push_back(12);int sum = count(v.begin(), v.end(), 12);cout << "12有" << sum << "个" << endl;}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}bool operator==(const Person& p){if (this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 32);Person p4("tony", 38);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);Person pp("sq", 32);int sum = count(v.begin(), v.end(), pp);cout << "与sq同岁的人有" << sum << "个" << endl;
}
count_if
void test01()
{vector<int>v;v.push_back(12);v.push_back(34);v.push_back(32);v.push_back(4);v.push_back(16);v.push_back(12);int sum = count_if(v.begin(), v.end(), greaterFive());cout << "大于5有" << sum << "个" << endl;
}
class Person
{
public:Person(string name, int age){m_Name = name;m_Age = age;}string m_Name;int m_Age;
};
class AgeGreater20
{
public:bool operator()(const Person&p){return p.m_Age > 20;}
};
void test02()
{vector<Person>v;Person p1("top", 10);Person p2("as", 32);Person p3("bob", 32);Person p4("tony", 38);Person p5("pig", 43);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person pp("sq", 32);int sum = count_if(v.begin(), v.end(), AgeGreater20());cout << "大于20的人有" << sum << "个" << endl;
}

常用排序算法

sort

函数原型:

class print02
{
public:void operator()(int num){cout << num << " ";}
};
class greaterInt
{
public:bool operator()(int a, int b){return a > b;}
};
void test01()
{vector<int> v;v.push_back(10);v.push_back(30);v.push_back(40);v.push_back(20);v.push_back(50);sort(v.begin(), v.end());//升序for_each(v.begin(), v.end(), print02());cout << endl;//降序//sort(v.begin(), v.end(), greater<int>());sort(v.begin(), v.end(), greaterInt());for_each(v.begin(), v.end(), print02());cout << endl;
}
random_shuffle

洗牌,指定范围内的元素随机调整次序

函数原型:

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}for_each(v.begin(), v.end(), print02());cout << endl;//利用洗牌算法 打乱顺序random_shuffle(v.begin(), v.end());for_each(v.begin(), v.end(), print02());cout << endl;
}

random_shuffle洗牌算法较实用,记得加随机种子

merge

两个有序的容器元素合并,并存储到另一容器中

合并之后的容器依旧是有序的

函数原型:

reverse

反转元素

函数原型:

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}for_each(v.begin(), v.end(), print02());cout << endl;reverse(v.begin(), v.end());for_each(v.begin(), v.end(), print02());cout << endl;
}

常用拷贝和替换算法

copy

copy(v.begin(), v.end(), v2.begin());

void test01()
{srand((unsigned int)time(NULL));vector<int> v;vector<int> v2;for (int i = 0; i < 10; ++i){v.push_back(i);}for_each(v.begin(), v.end(), print02());cout << endl;v2.resize(v.size());copy(v.begin(), v.end(), v2.begin());for_each(v2.begin(), v2.end(), print02());cout << endl;
}
replace

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}v.push_back(2);v.push_back(2);for_each(v.begin(), v.end(), print02());cout << endl;replace(v.begin(), v.end(), 2, 200);//将所有2改为200for_each(v.begin(), v.end(), print02());cout << endl;
}
replace_if

函数原型:

void test01()
{srand((unsigned int)time(NULL));vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}v.push_back(2);v.push_back(2);for_each(v.begin(), v.end(), print02());cout << endl;replace_if(v.begin(), v.end(), greaterFive(), 6);//将所有大于5的改为6for_each(v.begin(), v.end(), print02());cout << endl;
}
swap

函数原型:

常用算术生成算法

算法生成算法属于小型算法,使用时包含头文件#include<numeric>

accumulate

计算区间内 容器元素累计总和

函数原型:

#include<numeric>
void test01()
{vector<int> v;for (int i = 0; i <= 100; ++i){v.push_back(i);}//参数3是其实累加值int total = accumulate(v.begin(), v.end(), 0); //5050total = accumulate(v.begin(), v.end(), 1000);//6050//for_each(v.begin(), v.end(), print02());cout << total<< endl;
}
fill

向容器中填充指定的元素

函数原型:

void test01()
{vector<int>v;v.resize(10);//初始化10个0fill(v.begin(), v.end(), 100);//将0重新填充为100
}

常用集合算法

set_intersection

交集:

例:

v1: 0 1 2 3 4 5 6 7 8 9 10

v2: 5 6 7 8 9 10 11 12 13 14 15

交集: 5 6 7 8 9 10

两个集合必须是有序序列!!

void test01()
{vector<int> v;vector<int> v2;for (int i = 0; i <= 10; ++i){v.push_back(i);v2.push_back(i+5);}vector<int>vTarget;//目标容器需要提前开辟空间//最特殊情况也是占用空间最大情况:大容器包含小容器,//故开辟空间时取最小容器的sizevTarget.resize(min(v.size(), v2.size()));//获取交集//返回目标容器的最后一个元素的迭代器地址	vector<int>::iterator itEnd = set_intersection(v.begin(), v.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;
}
set_union

求集合并集

例:

v1: 0 1 2 3 4 5 6 7 8 9 10

v2: 5 6 7 8 9 10 11 12 13 14 15

并集: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

void test01()
{vector<int> v;vector<int> v2;for (int i = 0; i <= 10; ++i){v.push_back(i);v2.push_back(i+5);}for_each(v.begin(), v.end(), print02());cout << endl;for_each(v2.begin(), v2.end(), print02());cout << endl;vector<int>vTarget;//目标容器需要提前开辟空间//最特殊情况也是占用空间最大情况:两个容器没有交集,//并集就是两个容器size相加vTarget.resize(v.size()+v2.size());//获取并集vector<int>::iterator itEnd = set_union(v.begin(), v.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;
}
set_difference

差集

例:

v1: 0 1 2 3 4 5 6 7 8 9 10

v2: 5 6 7 8 9 10 11 12 13 14 15

v1和v2容器的差集: 0 1 2 3 4

v2和v1容器的差集:11 12 13 14 15

void test01()
{vector<int> v;vector<int> v2;for (int i = 0; i <= 10; ++i){v.push_back(i);v2.push_back(i+5);}for_each(v.begin(), v.end(), print02());cout << endl;for_each(v2.begin(), v2.end(), print02());cout << endl;vector<int>vTarget;//目标容器需要提前开辟空间//最特殊情况也是占用空间最大情况:两个容器没有交集,//差集就是两个容器中大的size作为目标容器开辟空间vTarget.resize(max(v.size(), v2.size()));//获取v1和v2的差集cout << "v1和v2的差集为:" << endl;vector<int>::iterator itEnd = set_difference(v.begin(), v.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;cout << "v2和v1的差集为:" << endl;itEnd = set_difference(v2.begin(), v2.end(), v.begin(), v.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, print02());cout << endl;
}

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

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

相关文章

git 推送出现fatal: The remote end hung up unexpectedly解决方案

在使用git更新或提交项目时候出现 "fatal: The remote end hung up unexpectedly " 的报错&#xff1b; 报错的原因原因是推送的文件太大。 下面给出解决方法 方法一&#xff1a; 修改提交缓存大小为500M&#xff0c;或者更大的数字 git config --global http.po…

企业申报“专精特新”,对知识产权有哪些要求?

深科信从深圳市中小企业服务局发布的公开数据中了解到&#xff0c;2022年深圳市专精特新中小企业申报8000余家&#xff0c;通过4800余家。2023年深圳市专精特新企业认定火热申报中&#xff0c;10月15日截止。 成为“专精特新”企业有什么好处? 1.国家级资质强力背书&#xff…

Docker搭建DNS服务器--nouse

前言 DNS服务器是(Domain Name System或者Domain Name Service)域名系统或者域名服务,域名系统为Internet上的主机分配域名地址和IP地址。 安装 2.1 实验环境 IP 系统版本 角色 192.168.40.121 Ubuntu 22.10 DNS服务器 192.168.40.122 Ubuntu 22.10 测试机器 2.2 …

尚硅谷wepack课程学习笔记

为什么需要使用打包工具&#xff1f; 开发时使用的框架、es6 语法 、less 等浏览器无法识别。 需要经过编译成浏览器能识别的css、js才可以运行。 打包工具可以帮我们编译&#xff0c;号可以做代码压缩、兼容处理、性能优化。 常见的打包工具有什么&#xff1f; vite、webpac…

服务注册发现_搭建单机Eureka注册中心

创建cloud-eureka-server7001模块 pom添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

Nginx 关闭/屏蔽 PUT、DELETE、OPTIONS 请求

1、修改 nginx 配置 在 nginx 配置文件中&#xff0c;增加如下配置内容&#xff1a; if ($request_method !~* GET|POST|HEAD) {return 403; }修改效果如下&#xff1a; 2、重启 nginx 服务 systemctl restart nginx或者 service nginx restart3、功能验证 使用如下方式…

基于MUSIC算法的二维超声波成像matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、基本原理 4.2、数学公式 4.3、实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................…

SpringBoot统一返回处理遇到cannot be cast to java.lang.String问题

ResponseBodyAdvice 接口概述 1、ResponseBodyAdvice 接口允许在执行 ResponseBody 或 ResponseEntity 控制器方法之后&#xff0c;但在使用 HttpMessageConverter 写入响应体之前自定义响应&#xff0c;进行功能增强。通常用于 加密&#xff0c;签名&#xff0c;统一数据格式…

视频汇聚/视频云存储/视频监控管理平台EasyCVR录像存储功能如何优化?具体步骤是什么?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。视频监控系统EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、…

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-GRU-Attention数据分类预测&#xff0c;运行环境Matlab2021b及以上&…

使用python处理MNIST数据集

文章目录 一. MNIST数据集1.1 什么是MNIST数据集1.2MNIST数据集文件格式1.3使用python访问MNIST数据集文件内容 附录程序源码 一. MNIST数据集 1.1 什么是MNIST数据集 MNIST数据集是入门机器学习/识别模式的最经典数据集之一。最早于1998年Yan Lecun在论文:[Gradient-based l…

Nginx 防止跨站脚本 Cross-Site Scripting (XSS)

1、修改 nginx 配置 在 nginx.conf 配置文件中&#xff0c;增加如下配置内容&#xff1a; add_header X-XSS-Protection "1; modeblock";X-XSS-Protection 的字段有三个可选配置值&#xff0c;说明如下&#xff1a; 0&#xff1a; 表示关闭浏览器的XSS防护机制&…

SAP PO运维(五):系统用户授权

1、访问 SAP PO 服务器和用户管理 访问服务器:http://hostname:port/startPage然后选择“用户管理” 2、创建新用户账号 3、授予权限

2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)

10. 灾后重建 Pear市一共有N&#xff08;<50000&#xff09;个居民点&#xff0c;居民点之间有M&#xff08;<200000&#xff09;条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近&#xff0c;一次严重的地震毁坏了全部M条道路。 震后…

web前端float布局、flex布局

1、float布局 <!DOCTYPE html> <html> <head><title>Login Page</title><style>body {font-family: Arial, sans-serif;background-color: #f3f3f3;}.container {max-width: 400px;margin: 0 auto;padding: 40px;background-color: #fff;…

什么是WhatsApp群发,WhatsApp协议,WhatsApp云控

那么WhatsApp群控云控可以做什么呢&#xff1f; 1、获客 自动化引流&#xff0c;强大的可控性&#xff0c;产品快速拓客 2、导流 一键式傻瓜化自动加好友&#xff0c;群发&#xff0c;朋友圈营销 3、群控 一键式拉群好友&#xff0c;建群&#xff0c;进群 …

前端react 18.2整合ckeditor富文本编辑器——配置插件、自定义toolbar工具栏

文章目录 ⭐前言⭐引入ckeditor⭐npm 包引入⭐cdn资源引入 ⭐自定义插件&#x1f496; 自定义yma16配置插件 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前端react整合ckeditor——配置插件、自定义toolbar工具栏。 react系列往期文章&#xff…

大数据的崭露头角:数据湖与数据仓库的融合之道

文章目录 数据湖与数据仓库的基本概念数据湖&#xff08;Data Lake&#xff09;数据仓库&#xff08;Data Warehouse&#xff09; 数据湖和数据仓库的优势和劣势数据湖的优势数据湖的劣势数据仓库的优势数据仓库的劣势 数据湖与数据仓库的融合之道1. 数据分类和标记2. 元数据管…

停车场系统源码

源码下载地址&#xff08;小程序开源地址&#xff09;&#xff1a;停车场系统小程序&#xff0c;新能源电动车充电系统&#xff0c;智慧社区物业人脸门禁小程序: 【涵盖内容】&#xff1a;城市智慧停车系统&#xff0c;汽车新能源充电&#xff0c;两轮电动车充电&#xff0c;物…

KT142C语音芯片flash型用户如何更新固件的说明_V2

目录 一、简介 2.1 让芯片进入PC模式 2.2 双击提供的exe程序即可 一、简介 正常的情况下&#xff0c;用户肯定是不需要更新固件的&#xff0c;因为芯片出厂默认就烧录了对应的程序固件&#xff0c;但是有客户可能需要小修小改&#xff0c;或者订制一下某些功能&#xff0c…