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

news2024/12/25 9:33:33

文章目录

  • 前言
  • 一、二分查找
      • 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};

    // 在有序序列中查找目标值 5
    if (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.coloradmin.cn/o/1465820.html

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

相关文章

企业计算机服务器中了crypt勒索病毒怎么办,crypt勒索病毒解密数据恢复

计算机服务器设备为企业的生产运营提供了极大便利&#xff0c;企业的重要核心数据大多都存储在计算机服务器中&#xff0c;保护企业计算机服务器免遭勒索病毒攻击&#xff0c;是一项艰巨的工作任务。但即便很多企业都做好的了安全运维工作&#xff0c;依旧免不了被勒索病毒攻击…

hexo+gitee免费打造个人网站导航

一、准备工作 本文在win10系统下进行环境搭建 1.可参考官方文档 hexo官方网站 Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown&#xff08;或其他标记语言&#xff09;解析文章&#xff0c;在几秒内&#xff0c;即可利用靓丽的主题生成静态网页 2.配置环境 这…

最新版opencv4.9安装介绍,基本图像处理详解

文章目录 一、什么是OpenCV &#xff1f;二. OpenCV 安装1. 下载地址2.安装命令&#xff1a;pip install opencv-python 三、图像基础1. 基本概念2. 坐标系3. 基本操作&#xff08;彩色图片&#xff09;&#xff08;1&#xff09;读取图片&#xff1a;cv2.imread( )&#xff08…

PCB共模辐射是如何产生的

目录 引言 模型分析01 模型分析02 模型分析03 模型分析04

记一次供应链的heapdump泄露到云接管

本文由掌控安全学院 -杳若 投稿 打点 开局一张图 分析 框架分析 首先发现使用的是前端的vue框架 注意/#/&#xff0c;存在的话基本都是vue&#xff0c;这时候就要从找接口开始 浅试登录 任意输入账号密码点击登录 发现校验了手机号的问题&#xff0c;这时候换个功能点 浅…

【OpenAI Sora】 如何使用:最新详细教程-新手小白必看

Sora 是什么&#xff1f; 2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型 Sora: https://openai.com/sora &#xff08;PS&#xff1a;目前 openai 官方还未开放 sora 灰度&#xff0c;不过根据文生图模型 DALLE 案例&#xff0c;一定是先给…

Spring Cloud部署篇1——Jar包部署至CentOS云服务器

一、项目介绍 系统模块 com.mingink |--mingink-api // 接口模块 | └──mingink-api-system // 系统接口 |--mingink-common // 通用模块 | └──mingink-common-core // 系统接口 |--mingink-gateway…

未来已来:数字孪生与智慧园区的深度融合

目录 一、数字孪生技术的概述 二、智慧园区的概念和发展 三、数字孪生与智慧园区的深度融合 四、数字孪生与智慧园区的未来展望 五、结论 随着科技的飞速发展&#xff0c;我们正处在一个日新月异的时代。数字孪生技术作为新兴的前沿科技&#xff0c;已经引起了全球范围内的…

喜报 | 2023上海文创资金拟支持名单公布,优积科技上榜

2023年8月9日&#xff0c;上海市文化创意产业推进领导小组办公室公布了《2023年上海市促进文化创意产业发展财政扶持资金拟支持项目&#xff08;第一批&#xff09;公示》&#xff0c;优积科技本次以“人工智能技术赋能模块化建筑设计的创新应用”项目荣获该资金财政扶持。 优积…

如何用GPT进行成像光谱遥感数据处理?

第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 ChatGPT的未来 第三&#xff1a;prompt 提示词 Prompt技巧&#xff08;大几岁&#xff09; 最好的原则和策…

QT常用类

五、常用类 QString 字符串类&#xff08;掌握&#xff09; QString是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c; 不再使用ASCII编码。QString使用的是Unicode编码。 QString中每个字符都是一个16位的QChar&#xff0c;而不是8位的char。 QString完全支持中文&…

模板(类模板)---C++

模板目录 2.类模板2.1 类模板语法2.2 类模板与函数模板区别2.3 类模板中成员函数创建时机2.4 类模板对象做函数参数2.5 类模板与继承2.6 类模板成员函数类外实现2.7 类模板分文件编写2.8 类模板与友元2.9 类模板案例 2.类模板 2.1 类模板语法 类模板作用&#xff1a; 建立一个…

2024 2.17~2.23 周报

一、本周计划 学习如何缝合模块&#xff0c;跑代码InversionNet、想idea并实验&#xff0c;准备开题报告&#xff0c;学习python基础语法 二、完成情况 1 学习如何在代码中加入模块 可添加的模块如&#xff1a; 通道注意力CA 空间注意力SA self attention变体 频域快速傅里…

漫漫数学之旅031

文章目录 经典格言数学习题古今评注名人小传 - 经典格言 如果没有数学知识&#xff0c;这个世界的事物是无法搞清楚的。——罗杰培根&#xff08;Roger Bacon&#xff09; 好的&#xff0c;各位看官&#xff0c;让我们来听听罗杰培根这位中世纪的“科学老顽童”是怎么说的&…

openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响

文章目录 openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响 openGauss学习笔记-227 openGauss性能调优-系统调优-其他因素对LLVM性能的影响 LLVM优化效果不仅依赖于数据库内部具体的实现&#xff0c;还与当前所选择的硬件环境等有关。 表达式调用C…

CrossOver2024虚拟机软件的优缺点分别是什么?

CrossOver虚拟机软件的优缺点分别如下&#xff1a; 优点&#xff1a; 无需双系统&#xff1a;用户可以在Mac或Linux系统上直接运行Windows应用程序&#xff0c;无需安装双系统&#xff0c;从而节省了硬盘空间并避免了系统切换的麻烦。易于安装和使用&#xff1a;CrossOver具有…

基于SpringBoot的在线拍卖系统设计与实现(源码+调试+LW+PPT)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的在线拍…

初探Web客户端追踪技术

前言 案例1 当我们首次浏览网站时&#xff0c;在网页的下方位置经常会出现提示&#xff0c;询问是否允许使用 Cookie 来提供服务和流量。为了不被挡住浏览的内容&#xff0c;我们经常会下意识地点击“接受”&#xff0c;然后继续浏览。看似无害而有害增强你在这个网站上的体验…

基于springboot财务管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

C# cass10 宗地初始化-根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层

运行环境Visual Studio 2022 c# cad2016 cass10 根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层 一、主要步骤 zdimport 方法&#xff1a;这个方法用于导入宗地信息。首先通过调用 AutoCAD API 获取当前活动文档、数据库和编辑器对象。然后根据 CreatePalette.Se…