【C++提高编程-09】----C++ STL之常用排序算法

news2024/11/24 21:23:03

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页:@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,

点赞加收藏支持我,点击关注,一起进步!

前言

       STL(Standard Template Library)是C++标准库的一部分,提供了丰富的数据结构和算法,用于处理数据和实现常见的计算任务。STL中的算法分为几类,包括遍历算法、修改算法、排序算法、查找算法、数值算法等,每类算法都有其特定的应用场景和功能。

正文

01-排序算法之sort用法     

sort 算法详解

语法

template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
  • RandomAccessIterator:表示随机访问迭代器类型,用于指定排序范围。
  • first:表示排序范围的起始位置。
  • last:表示排序范围的结束位置,不包含在范围内。
  • comp:可选参数,用于指定排序的比较函数对象。

参数

  • first:排序范围的起始位置。
  • last:排序范围的结束位置,不包含在范围内。
  • comp:可选参数,用于指定排序的比较函数对象。如果不提供此参数,默认使用 < 运算符进行比较。

功能

sort 算法用于对范围 [first, last) 内的元素进行排序,默认以升序方式排列。

返回值

  • sort 函数没有返回值,直接在原始范围上进行排序操作。

示例

以下是使用 sort 算法对整数向量进行排序的示例:

#include <iostream>
#include <vector>
#include <algorithm> // 包含 sort 函数

int main() {
    std::vector<int> numbers = {5, 2, 8, 3, 1, 4};

    // 使用 sort 对向量进行升序排序
    std::sort(numbers.begin(), numbers.end());

    std::cout << "升序排序后的结果为: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果将是 “升序排序后的结果为: 1 2 3 4 5 8”。在这个例子中,sort 函数对向量 numbers 中的元素进行了升序排序,并输出排序后的结果。

注意事项

  • sort 算法默认使用 < 运算符进行比较,可通过提供自定义的比较函数对象 comp 进行特定排序。
  • 对于自定义数据类型,确保比较函数对象 comp 或重载 < 运算符,以确保算法能正确比较对象。

通过 sort 算法,可以方便地对容器内的元素进行排序操作,适用于各种数据结构和排序需求。

        这段代码演示了C++中对vector容器内元素进行排序的基本用法,并展示了如何使用自定义的比较函数来实现不同的排序顺序。

  1. 包含头文件和定义函数

    • #include <algorithm>:包含了标准库中的排序算法 sort 和 greater
    • #include <vector>:包含了使用的容器 vector
    • void myPrint(int val):定义了一个简单的函数 myPrint,用于输出整数值。
  2. 定义测试函数 test01()

    • 创建了一个整数类型的 vector v,并向其中添加了几个整数元素。
    • 使用 sort(v.begin(), v.end()) 对 vector v 进行升序排序(默认情况下)。
    • 使用 for_each(v.begin(), v.end(), myPrint) 遍历输出排序后的元素,函数 myPrint 负责打印每个元素。
    • 执行 cout << endl; 输出换行。
  3. 反向排序示例

    • 使用 sort(v.begin(), v.end(), greater<int>()) 对 vector v 进行降序排序。greater<int>() 是一个函数对象,表示按照大于号 (>) 的方式进行比较。
    • 再次使用 for_each(v.begin(), v.end(), myPrint) 输出降序排序后的元素。
    • 执行 cout << endl; 输出换行。
  4. 主函数 main()

    • 调用 test01() 函数来执行上述排序和输出操作。
    • 最后使用 system("pause"); 在控制台暂停程序的执行,等待用户按下任意键结束程序。

这段代码通过展示 sort 函数的基本使用,演示了如何实现升序和降序排序,以及如何自定义比较函数来满足不同的排序需求。

#include <algorithm>
#include <vector>
void myPrint(int val)
{
	cout << val << " ";
}
void test01() {
	vector<int> v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(50);
	v.push_back(20);
	v.push_back(40);
	//sort默认从小到大排序
	sort(v.begin(), v.end());
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
	//从大到小排序
	sort(v.begin(), v.end(), greater<int>());
	for_each(v.begin(), v.end(), myPrint);
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

02-排序算法之random_shuffle用法     

random_shuffle 算法详解

语法

template <class RandomAccessIterator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last);

template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator&& rand);
  • RandomAccessIterator:表示随机访问迭代器类型,用于指定要打乱的范围。
  • first:表示打乱范围的起始位置。
  • last:表示打乱范围的结束位置,不包含在范围内。
  • rand:可选参数,表示用于生成随机数的随机数生成器对象。

参数

  • first:打乱范围的起始位置。
  • last:打乱范围的结束位置,不包含在范围内。
  • rand:可选参数,用于指定随机数生成器对象。如果不提供此参数,默认使用 std::default_random_engine 生成随机数。

功能

random_shuffle 算法用于对范围 [first, last) 内的元素进行随机打乱。

返回值

  • random_shuffle 函数没有返回值,直接在原始范围上进行元素打乱操作。

示例

以下是使用 random_shuffle 算法对整数向量进行随机打乱的示例:

#include <iostream>
#include <vector>
#include <algorithm> // 包含 random_shuffle 函数
#include <random> // 包含随机数生成器

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    // 使用 random_shuffle 对向量进行随机打乱
    std::random_shuffle(numbers.begin(), numbers.end());

    std::cout << "随机打乱后的结果为: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果将是随机的顺序,例如 “随机打乱后的结果为: 5 7 1 4 3 2 8 9 10 6”。在这个例子中,random_shuffle 函数对向量 numbers 中的元素进行了随机打乱,并输出打乱后的结果。

注意事项

  • random_shuffle 算法使用默认的随机数生成器来生成随机数。如果需要定制化的随机数生成器,可以提供自定义的随机数生成器对象。
  • 对于自定义数据类型,确保实现了迭代器的随机访问能力,以便算法能正确操作范围内的元素。

通过 random_shuffle 算法,可以方便地对容器内的元素进行随机打乱操作,适用于各种需要随机顺序的场景。

这段代码展示了如何使用 C++ 的 random_shuffle 算法对 vector 容器内的元素进行随机打乱,并输出打乱后的结果。

  1. 包含头文件和定义类

    • #include <algorithm>:包含了标准库中的 random_shuffle 算法。
    • #include <vector>:包含了使用的容器 vector
    • #include <ctime>:包含了 time 函数,用于获取当前时间。
    • #include <cstdlib>:包含了 srand 和 rand 函数,用于设置和获取随机数种子。
  2. 定义类 myPrint

    • class myPrint:定义了一个仿函数 (function object),其中重载了 operator(),用于输出整数值。
  3. 定义测试函数 test01()

    • srand((unsigned int)time(NULL));:通过调用 srand 函数设置随机数种子,使用当前时间作为种子,确保每次运行得到不同的随机结果。
    • 创建了一个整数类型的 vector v,并使用 for 循环向其中添加了整数元素 0 到 9。
    • 使用 for_each(v.begin(), v.end(), myPrint()) 遍历输出 vector 中的元素,函数对象 myPrint 负责打印每个元素。
    • 执行 cout << endl; 输出换行。
  4. 随机打乱示例

    • 使用 random_shuffle(v.begin(), v.end()) 对 vector v 中的元素进行随机打乱。
    • 再次使用 for_each(v.begin(), v.end(), myPrint()) 输出打乱后的元素。
    • 执行 cout << endl; 输出换行。
  5. 主函数 main()

    • 调用 test01() 函数来执行上述随机打乱和输出操作。
    • 使用 system("pause"); 在控制台暂停程序的执行,等待用户按下任意键结束程序。

这段代码通过调用 random_shuffle 函数实现了对 vector 容器内元素的随机打乱,展示了如何利用随机数种子确保每次打乱结果的随机性。

#include <algorithm>
#include <vector>
#include <ctime>
class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
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(), myPrint());
	cout << endl;
	//打乱顺序
	random_shuffle(v.begin(), v.end());
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

03-排序算法之merge用法     

merge 算法详解

语法

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                      InputIterator2 first2, InputIterator2 last2,
                      OutputIterator result);
  • InputIterator1:表示第一个有序序列的迭代器类型。
  • InputIterator2:表示第二个有序序列的迭代器类型。
  • OutputIterator:表示目标序列的迭代器类型。

参数

  • first1:第一个有序序列的起始位置。
  • last1:第一个有序序列的结束位置(不包含在范围内)。
  • first2:第二个有序序列的起始位置。
  • last2:第二个有序序列的结束位置(不包含在范围内)。
  • result:目标序列的起始位置,用于存储合并后的有序序列。

功能

merge 算法用于将两个已排序的序列合并为一个新的有序序列,并存储到目标序列中。

返回值

  • merge 函数返回一个迭代器,指向目标序列中的末尾位置(合并后序列的下一个位置)。

示例

以下是使用 merge 算法将两个已排序的向量合并为一个新的有序向量的示例:

#include <iostream>
#include <vector>
#include <algorithm> // 包含 merge 函数

int main() {
    std::vector<int> v1 = {1, 3, 5, 7, 9};
    std::vector<int> v2 = {2, 4, 6, 8, 10};
    std::vector<int> merged(v1.size() + v2.size());

    // 使用 merge 将 v1 和 v2 合并为 merged
    std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), merged.begin());

    std::cout << "合并后的有序序列为: ";
    for (int num : merged) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果将是合并后的有序序列,例如 “合并后的有序序列为: 1 2 3 4 5 6 7 8 9 10”。在这个例子中,merge 函数将两个已排序的向量 v1 和 v2 合并为一个新的有序向量 merged

注意事项

  • merge 算法要求输入序列必须是已排序的,否则结果将不符合预期。
  • 如果输入序列有重复元素,merge 算法会保持这些重复元素的顺序。
  • 目标序列 result 的长度必须足够大,能够容纳合并后的所有元素,否则可能导致未定义行为。

通过 merge 算法,可以方便地将两个已排序的序列合并为一个新的有序序列,适用于各种需要合并排序结果的场景。

这段代码展示了如何使用 C++ 的 merge 算法将两个已排序的 vector 合并到一个新的目标 vector 中,并通过自定义的 myPrint 函数对象输出合并后的结果。

代码解释

  1. 包含头文件和定义类

    #include <algorithm>  // 包含 merge 算法
    #include <vector>
    #include <iostream>   // 包含 cout 和 endl
    using namespace std;  // 使用标准命名空间
    
    • #include <algorithm>:包含了标准库中的 merge 算法。
    • #include <vector>:包含了使用的容器 vector
    • #include <iostream>:用于标准输出 cout 和换行 endl
    • using namespace std;:使用标准库的命名空间,避免每次使用标准库中的元素时都需要加上 std:: 前缀。
  2. 定义类 myPrint

    class myPrint
    {
    public:
        void operator()(int val)
        {
            cout << val << " ";
        }
    };
    
    • myPrint 类是一个函数对象,重载了 operator(),用于输出整数值 val,并在每个值后面添加空格。
  3. 定义测试函数 test01()

    void test01()
    {
        vector<int> v1;
        vector<int> v2;
    
        // 向 v1 和 v2 中添加元素
        for (int i = 0; i < 10; i++)
        {
            v1.push_back(i);
            v2.push_back(i + 1);
        }
    
        vector<int> vtarget;
        // 目标容器 vtarget 需要提前开辟空间
        vtarget.resize(v1.size() + v2.size());
    
        // 合并两个有序序列 v1 和 v2 到 vtarget 中
        merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin());
    
        // 使用 for_each 和 myPrint 输出合并后的结果
        for_each(vtarget.begin(), vtarget.end(), myPrint());
        cout << endl;
    }
    
    • 创建了两个 vector 容器 v1 和 v2,分别存储整数序列 {0, 1, 2, ..., 9} 和 {1, 2, 3, ..., 10}
    • 创建了一个目标容器 vtarget,使用 resize 函数提前为其分配了足够的空间,以便存储合并后的结果。
    • 调用 merge 函数,将 v1 和 v2 中的元素合并到 vtarget 中。
    • 使用 for_each 算法遍历 vtarget,并利用 myPrint 函数对象输出每个元素。
  4. 主函数 main()

    int main() {
        test01();
        system("pause");
        return 0;
    }
    
    • 在 main 函数中调用 test01() 来执行上述合并和输出操作。
    • 使用 system("pause") 让程序在控制台暂停,等待用户按任意键结束程序的执行。

总结

这段代码展示了如何利用 merge 算法将两个已排序的 vector 合并成一个新的有序 vector,并通过自定义的函数对象 myPrint 输出合并后的结果。使用 resize 来提前分配空间,确保目标容器能够容纳所有合并后的元素,是 merge 算法使用的必要步骤之一。

#include <algorithm>
#include <vector>
class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
void test01()
{
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 1);
	}
	vector<int> vtarget;
	//目标容器需要提前开辟空间
	vtarget.resize(v1.size() + v2.size());
	//合并 需要两个有序序列
	merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vtarget.begin());
	for_each(vtarget.begin(), vtarget.end(), myPrint());
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

04-排序算法之reverse用法     

排序算法之reverse用法详细解释一下

reverse 算法详解

语法

template <class BidirectionalIterator>
void reverse (BidirectionalIterator first, BidirectionalIterator last);
  • BidirectionalIterator:表示一个能够向前和向后遍历的迭代器类型。

参数

  • first:要反转的序列的起始位置。
  • last:要反转的序列的结束位置(不包含在范围内)。

功能

reverse 算法用于将指定范围内的元素顺序完全反转。

示例

以下是使用 reverse 算法反转一个 vector 的示例:

#include <iostream>
#include <vector>
#include <algorithm> // 包含 reverse 函数

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    // 使用 reverse 将 vector 反转
    std::reverse(v.begin(), v.end());

    std::cout << "反转后的 vector: ";
    for (int num : v) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出结果将是反转后的 vector,例如 “反转后的 vector: 5 4 3 2 1”。在这个例子中,reverse 函数将 v 中的元素顺序完全反转。

注意事项

  • reverse 算法会直接修改原始序列,而不是返回新的序列。
  • 序列中的元素顺序完全反转,即第一个元素变成最后一个,最后一个变成第一个,依此类推。
  • 如果 first == last,或者序列中只有一个元素,则不会进行任何操作。

通过 reverse 算法,可以方便地对容器或者数组中的元素顺序进行反转操作,适用于各种需要逆序处理的场景。

这段代码展示了如何使用 C++ 标准库中的 reverse 算法来反转一个 vector 中的元素,并通过自定义的 myPrint 函数对象输出反转前后的结果。

  1. 包含头文件和定义类

    #include <algorithm>  // 包含 reverse 算法
    #include <vector>
    #include <iostream>   // 包含 cout 和 endl
    using namespace std;  // 使用标准命名空间
    
    • #include <algorithm>:包含了标准库中的 reverse 算法。
    • #include <vector>:包含了使用的容器 vector
    • #include <iostream>:用于标准输出 cout 和换行 endl
    • using namespace std;:使用标准库的命名空间,避免每次使用标准库中的元素时都需要加上 std:: 前缀。
  2. 定义类 myPrint

    class myPrint
    {
    public:
        void operator()(int val)
        {
            cout << val << " ";
        }
    };
    
    • myPrint 类是一个函数对象,重载了 operator(),用于输出整数值 val,并在每个值后面添加空格。
  3. 定义测试函数 test01()

    void test01()
    {
        vector<int> v = {10, 30, 50, 20, 40};
    
        cout << "反转前: " << endl;
        for_each(v.begin(), v.end(), myPrint());
        cout << endl;
    
        // 使用 reverse 函数反转 vector v 中的元素
        reverse(v.begin(), v.end());
    
        cout << "反转后: " << endl;
        for_each(v.begin(), v.end(), myPrint());
        cout << endl;
    }
    
    • 创建了一个 vector 容器 v,并向其中添加了整数元素 {10, 30, 50, 20, 40}

    • 使用 for_each 算法和自定义的 myPrint 函数对象输出 vector 中的元素,展示了反转前的顺序。

    • 调用 reverse(v.begin(), v.end()) 将 vector v 中的元素顺序完全反转。

    • 再次使用 for_each 和 myPrint 输出反转后的 vector 元素顺序。

  4. 主函数 main()

    int main() {
        test01();
        system("pause");
        return 0;
    }
    
    • 在 main 函数中调用 test01() 来执行上述反转和输出操作。
    • 使用 system("pause") 让程序在控制台暂停,等待用户按任意键结束程序的执行。

总结

这段代码演示了如何使用 C++ 标准库的 reverse 算法来反转 vector 容器中的元素。通过 reverse 函数可以快速、方便地修改容器中元素的顺序,适用于需要倒序处理数据的各种场景。

#include <algorithm>
#include <vector>
class myPrint
{
public:
	void operator()(int val)
	{
		cout << val << " ";
	}
};
void test01()
{
	vector<int> v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(50);
	v.push_back(20);
	v.push_back(40);
	cout << "反转前: " << endl;
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
	cout << "反转后: " << endl;
	reverse(v.begin(), v.end());
	for_each(v.begin(), v.end(), myPrint());
	cout << endl;
}
int main() {
	test01();
	system("pause");
	return 0;
}

总结

      STL(Standard Template Library)提供了多种排序算法,每种算法都有其特定的优势和适用场景。

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

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

相关文章

基于单片机的无线遥控自动翻书机械臂设计

摘 要&#xff1a; 本设备的重点控制部件为单片机&#xff0c;充分实现了其自动化的目的。相关研究表明&#xff0c;它操作简单便捷&#xff0c;使残疾人在翻书时提供了较大的便利&#xff0c;使用价值性极高&#xff0c;具有很大的发展空间。 关键词&#xff1a; 机械臂&…

Django后台忘记管理员的账号

使用命令启动项目&#xff1a; python manage.py runserver输入后缀/admin&#xff0c;进入后台管理员&#xff0c;如果此时忘记你先前设置的用户名与密码怎么办&#xff1f; 终端输入&#xff1a; python manage.py shell 输入以下内容&#xff0c;并查看返回结果&#xff…

大跨度气膜综合馆有哪些优势—轻空间

1. 经济高效 材料和施工成本低 气膜综合馆的建设成本相对较低&#xff0c;主要材料为膜材和充气系统&#xff0c;不需要大量的钢筋混凝土和复杂的结构施工&#xff0c;降低了材料和施工成本。 能源消耗低 气膜馆的双层膜结构和充气系统具有良好的保温性能&#xff0c;减少了冬…

【经典爬虫案例】用Python爬取微博热搜榜!

一、爬取目标 本次爬取的是: 微博热搜榜 &#xff08;代码也可直接在下方拿&#xff09;&#xff1a; ​ 分别爬取每条热搜的&#xff1a; 热搜标题、热搜排名、热搜类别、热度、链接地址。 下面&#xff0c;对页面进行分析。 经过分析&#xff0c;此页面没有XHR链接通过&am…

Sping源码(九)—— Bean的初始化(非懒加载)— Bean的创建方式(自定义BeanPostProcessor)

序言 之前文章有介绍采用FactoryBean的方式创建对象&#xff0c;以及使用反射创建对象。 这篇文章继续介绍Spring中创建Bean的形式之一——自定义BeanPostProcessor。 之前在介绍BeanPostProcessor的文章中有提到&#xff0c;BeanPostProcessor接口的实现中有一个Instantiatio…

Proxmox VE 超融合集群扩容后又平稳运行了170多天--不重启的话,488天了

五个节点的Proxmox VE 超融合集群&#xff0c;扩从了存储容量&#xff0c;全NVMe高速盘&#xff0c;单机4条3.7TB容量&#xff08;扩容前是两块NVMe加两块16TB的慢速SATA机械盘&#xff0c;拔掉机械盘&#xff0c;替换成两块NVMe&#xff09;&#xff0c;速度那叫一个快啊。 当…

秋招突击——6/16——复习{(单调队列优化DP)——最大子序和,背包模型——宠物小精灵收服问题}——新作{二叉树的后序遍历}

文章目录 引言复习&#xff08;单调队列优化DP&#xff09;——最大子序和单调队列的基本实现思路——求可移动窗口中的最值总结 背包模型——宠物小精灵收服问题思路分析参考思路分析 新作二叉树的后续遍历加指针调换 总结 引言 复习 &#xff08;单调队列优化DP&#xff09…

Qt实现单例模式:Q_GLOBAL_STATIC和Q_GLOBAL_STATIC_WITH_ARGS

目录 1.引言 2.了解Q_GLOBAL_STATIC 3.了解Q_GLOBAL_STATIC_WITH_ARGS 4.实现原理 4.1.对象的创建 4.2.QGlobalStatic 4.3.宏定义实现 4.4.注意事项 5.总结 1.引言 设计模式之单例模式-CSDN博客 所谓的全局静态对象&#xff0c;大多是在单例类中所见&#xff0c;在之前…

使用ant-design/cssinjs向plasmo浏览器插件的内容脚本content中注入antd的ui组件样式

之前写过一篇文章用来向content内容脚本注入antd的ui&#xff1a;https://xiaoshen.blog.csdn.net/article/details/136418199&#xff0c;但是方法就是比较繁琐&#xff0c;需要将antd的样式拷贝出来&#xff0c;然后贴到一个单独的css样式文件中&#xff0c;然后引入到内容脚…

20个超实用的VS Code扩展(2024年版)

大家好&#xff0c;今天小程给大家带来一篇关于 VS Code 扩展的文章。VS Code 这几年做得是风生水起&#xff0c;可以算得上是微软的良心产品&#xff0c;其最大的优势就是拥有众多高质量的扩展。在本文中&#xff0c;将向大家推荐一些我认为在 2024 年对开发者来说又实用又好用…

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(分布式协议)

探索分析从起源到现今的巅峰之旅2 前提回顾最终一致性Clock时钟机制局限性 CAP协议CAP理论的三要素A和C机制的保障P分区容错性AP机制的保障CP机制的保障 分布式系统方向 分布式系统之ZookeeperZK的作用和职责协调服务命名服务构建高可靠服务 ZK的常见用法ZK基本原理ZK的顺序一致…

将粘贴文本进输入框中时不带有任何格式(包括背景颜色和字体)解决办法

只需要四行代码解决&#xff0c;这里用到vue3里面的事件 paste"" 代码块&#xff1a; <div paste"handlePaste"></div>//粘贴文本时不带有任何格式&#xff08;包括背景颜色和字体&#xff09;function handlePaste(event) {event.preventDef…

【计算机毕业设计】234基于微信小程序的中国各地美食推荐平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【数据分析】用Python做事件抽取任务-快速上手方案

目录 方法一&#xff1a;使用OmniEvent库安装OmniEvent使用OmniEvent进行事件抽取OmniEvent优点缺点 方法二&#xff1a;使用大模型使用GPT网页版进行事件抽取事件类型列表 大模型优点缺点 总结 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;事件抽取是一项关键任…

多组学双疾病串扰怎么做?PAN-AD九个机器学习+MR+单细胞,工作量不少

说在前面 “串扰”这个名词听起来高级了一个level&#xff0c;其实就是MR-通路的双疾病联合分析。虽然是筛选标志物的思路&#xff0c;但是工作量不小&#xff0c;作者还收集了13个不同AD自身免疫疾病数据集用于验证自己的机器学习模型&#xff0c;分析就是一些常规的WGCNA、P…

基于sass模式Java语言+MySQL + MyCat开发的his系统源码 HIS系统住院业务流程 HIS系统住院流程化管理

基于sass模式Java语言MySQL MyCat开发的his系统源码 HIS系统住院业务流程 HIS系统住院流程化管理 HIS系统住院业务&#xff0c;该系统为医院提供了一套完整的住院业务流程解决方案&#xff0c;旨在提高住院管理的效率和精确度。通过HIS系统&#xff0c;医院工作人员可以某轻理…

DzzOffice集成功能最丰富的开源PHP+MySQL办公系统套件

DzzOffice是一套开源办公套件&#xff0c;旨在为企业和团队提供类似“Google企业应用套件”和“微软Office365”的协同办公平台。以下是对DzzOffice的详细介绍&#xff1a; 主要功能和应用&#xff1a; 网盘&#xff1a;支持企业、团队文件的集中管理&#xff0c;提供文件标签…

Oracle 是否扼杀了开源 MySQL

Oracle 是否无意中扼杀了开源 MySQL Peter Zaitsev是一位俄罗斯软件工程师和企业家&#xff0c;曾在MySQL公司担任性能工程师。大约15年前&#xff0c;当甲骨文收购Sun公司并随后收购MySQL时&#xff0c;有很多关于甲骨文何时“杀死MySQL”的讨论。他曾为甲骨文进行辩护&#…

攻防演练“轻装上阵” | 亚信安全信舱ForCloud 打造全栈防护新策略

网络世界攻防实战中&#xff0c;攻击风险已经从代码到云横跨全栈技术点&#xff0c;你准备好了吗 云服务器&#xff0c;攻击众矢之的 2022年超过38万个Kubernetes API服务器暴露公网&#xff0c;成为攻击者目标。云服务器&#xff0c;尤其是开源设施&#xff0c;一直以来不仅是…