【C++入门到精通】C++入门 —— set multiset (STL)

在这里插入图片描述

阅读导航

  • 前言
  • 一、set简介
  • 二、std::set
    • 1. std::set简介
    • 2. std::set的使用
      • - 基本使用
      • - std::set的模板参数列表
      • - std::set的构造函数
      • - std::set的迭代器
      • - std::set容量与元素访问函数
    • 3. set的所有函数(表)
  • 三、std::multiset
    • 1. std::multiset简介
  • 四、std::set与std::multiset的比较
    • ⭕**相同点**
    • ⭕**不同点**
    • 如何选择set 和 multiset
  • 温馨提示

前言

前面我们讲了C语言的基础知识,也了解了一些初阶数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,也了解了C++中的模版,以及学习了几个STL的结构也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点—— set & multiset (STL) 。下面话不多说坐稳扶好咱们要开车了😍

一、set简介

在C++中,set是标准库中的一个容器,它实现了有序、不重复的元素集合set容器基于红黑树数据结构实现,提供了一系列的成员函数和操作符,用于对元素进行插入、删除、查找等操作。其中set又分为setmultiset,接下来博主将会带着大家认识一下这两个函数。

🔴 官方文档 > 链接

在这里插入图片描述

二、std::set

1. std::set简介

⭕ 官方文档 > 链接

在这里插入图片描述
std::set是C++标准库中提供的一个容器,它实现了一种有序的、不重复的元素集合。每个元素在std::set容器中都唯一,并且以特定的顺序进行排序。std::set是基于红黑树数据结构实现的,因此它具有高效的插入、删除和查找操作。

🍔以下是std::set容器的一些特点:

  1. 有序存储std::set中的元素是按照特定的排序准则进行有序存储的,默认以升序排列。可以通过提供自定义的比较函数或函数对象来改变排序方式。
  2. 唯一性std::set容器中的元素是唯一的,不允许存在重复的元素。当尝试插入已经存在的元素时,插入操作不会生效。
  3. 动态大小std::set容器可以根据需要动态地增加或减少其大小。可以通过插入和删除操作来修改容器中的元素数量。
  4. 快速插入、删除和查找:基于红黑树数据结构,std::set容器提供了高效的插入、删除和查找操作。这些操作的平均时间复杂度为O(logN),其中N是容器中的元素数。
  5. 迭代器支持std::set容器提供了迭代器,可以用于遍历容器中的元素,并对其进行读取或修改操作。
  6. 不支持直接访问元素:由于std::set是基于有序集合实现的,它并不支持通过下标操作符([])直接访问元素。如果需要按索引访问元素,可以使用其他容器类型,如std::vector
  7. 内存开销相对较大:由于红黑树的特性,std::set容器在内存使用方面可能比其他容器类型更占用空间。

🚨🚨注意

  • std::set中的元素是有序存储的,因此插入、删除操作的时间复杂度为O(logN),查找操作的时间复杂度也为O(logN),其中N为std::set中元素的个数。
  • 使用std::set需要包含 <set> 头文件,并使用 std::set 关键字声明一个std::set对象。

2. std::set的使用

- 基本使用

#include <set>
#include <iostream>int main() {std::set<int> mySet;// 插入元素mySet.insert(10);mySet.insert(5);mySet.insert(8);// 遍历元素for (const auto& elem : mySet) {std::cout << elem << " ";}// 输出:5 8 10// 查找元素auto it = mySet.find(8);if (it != mySet.end()) {std::cout << "Element found: " << *it << std::endl;} else {std::cout << "Element not found" << std::endl;}// 删除元素mySet.erase(8);return 0;
}

上述示例演示了创建一个std::set对象,插入元素并遍历打印,查找特定元素,并删除元素的基本操作。

- std::set的模板参数列表

在这里插入图片描述
🍪模板参数列表用于指定容器存储的元素类型和相关的比较函数。std::set 的模板参数列表如下:

template<class Key,class Compare = std::less<Key>,class Allocator = std::allocator<Key>
> class set;
  1. Key:指定 std::set 容器中存储的元素类型。它可以是任何可比较的类型,例如基本数据类型(整数、浮点数)、结构体、类对象等。元素类型必须支持 < 或自定义的比较函数用于元素排序。

  2. Compare(可选):用于比较元素的函数或函数对象,用于确定元素的相对顺序。默认情况下,使用 std::less<Key>,即使用 < 运算符进行比较。如果希望使用其他比较方式,可以自定义一个比较函数或函数对象,并将其作为 Compare 参数传递给 std::set。比较函数或函数对象应该满足严格弱排序的要求。

  3. Allocator(可选):指定用于分配内存的分配器类型。默认情况下,使用 std::allocator<Key>,它使用标准的内存分配操作符 newdelete。也可以使用自定义的分配器类型,以便对内存分配进行更灵活的控制。

- std::set的构造函数

下面的表格中列出了 std::set 的各种构造函数及其描述:

构造函数描述
set()默认构造函数,创建一个空的 std::set 容器。
set(const set& other)复制构造函数,创建一个新的 std::set 容器,并复制给定容器中的所有元素。
set(set&& other) noexcept移动构造函数,创建一个新的 std::set 容器,并使用给定容器中的元素初始化它。
set(InputIt first, InputIt last)使用迭代器构造一个 std::set 容器,并将给定范围内的元素添加到其中。输入迭代器应指向可比较的类型。
set(InputIt first, InputIt last, const Compare& comp)使用自定义比较函数构造一个 std::set 容器,并将给定范围内的元素添加到其中。输入迭代器应指向可比较的类型。
set(std::initializer_list < key> init)使用初始化列表构造一个 std::set 容器。
set(std::initializer_list< Key> init, const Compare& comp)使用自定义比较函数和初始化列表构造一个 std::set 容器。

其中,Key 表示元素类型,Compare 表示比较函数类型,InputIt 表示输入迭代器类型。

这些构造函数提供了多种不同的方式来初始化 std::set 容器,并将元素添加到其中。可以使用默认构造函数创建一个空容器,使用复制构造函数从另一个容器中复制元素,或使用迭代器和初始化列表来初始化容器。您还可以通过在构造函数参数中指定比较函数来控制元素的排序方式。

- std::set的迭代器

下面的表格中列出了 std::set 的一些常用迭代器相关函数及其描述:

函数描述
iterator begin()返回一个指向容器中第一个元素的迭代器。
const_iterator begin() const返回一个指向容器中第一个元素的只读迭代器。
iterator end()返回一个指向容器中最后一个元素之后位置的迭代器。
const_iterator end() const返回一个指向容器中最后一个元素之后位置的只读迭代器。
reverse_iterator rbegin()返回一个指向容器中最后一个元素的反向迭代器。
const_reverse_iterator rbegin() const返回一个指向容器中最后一个元素的只读反向迭代器。
reverse_iterator rend()返回一个指向容器中第一个元素之前位置的反向迭代器。
const_reverse_iterator rend() const返回一个指向容器中第一个元素之前位置的只读反向迭代器。
const_iterator cbegin() const返回一个指向容器中第一个元素的只读迭代器。
const_iterator cend() const返回一个指向容器中最后一个元素之后位置的只读迭代器。
const_reverse_iterator crbegin() const返回一个指向容器中最后一个元素的只读反向迭代器。
const_reverse_iterator crend() const返回一个指向容器中第一个元素之前位置的只读反向迭代器。

这些函数用于获取不同类型的迭代器,以访问 std::set 容器中的元素。您可以使用普通的正向迭代器(begin()end())来遍历容器中的元素,也可以使用反向迭代器(rbegin()rend())来从后往前遍历容器。还提供了只读的常量迭代器和只读的常量反向迭代器,以及对应的 cbegin()cend()crbegin()crend() 函数。

- std::set容量与元素访问函数

容量函数:

  • bool empty() const noexcept:

    • 该函数用于检查容器是否为空。
    • 如果容器为空,则返回 true;否则,返回 false
  • size_t size() const noexcept:

    • 该函数返回容器中元素的数量。
    • 返回一个无符号整数,表示容器中存储的元素个数。
  • size_t max_size() const noexcept:

    • 该函数返回容器能够存储的最大元素数量。
    • 返回一个无符号整数,表示容器能够支持的最大元素数量。

元素访问函数:

  • std::set::iterator find(const Key& key):

    • 如果找到了匹配的元素,则返回指向该元素的迭代器;
    • 如果未找到匹配的元素,则返回指向容器结尾的迭代器 end()
  • std::set::const_iterator find(const Key& key) const:

    • 该函数在容器中查找给定的键值,并返回指向该元素的只读迭代器。
    • 这是 find 函数的只读版本,返回一个指向匹配元素的只读迭代器或 end()
  • size_t count(const Key& key) const:

    • 该函数统计容器中具有给定键值的元素个数。
    • 返回一个无符号整数,表示具有给定键值的元素个数。
  • std::pair<std::set::iterator, std::set::iterator> equal_range(const Key& key):

    • 该函数返回一个 pair 对象,其中包含容器中所有键值等于给定键值的元素范围的起始和结束迭代器。
    • 返回一个由两个迭代器组成的 pair 对象,第一个迭代器指向键值范围的起始位置,第二个迭代器指向键值范围的结束位置后面的位置。
  • std::pair<std::set::const_iterator, std::set::const_iterator> equal_range(const Key& key) const:

    • 该函数是 equal_range 函数的只读版本,返回一个 pair 对象,其中包含容器中所有键值等于给定键值的只读元素范围的起始和结束迭代器。

3. set的所有函数(表)

函数用法功能
bool empty() const noexceptset.empty()检查容器是否为空
size_t size() const noexceptset.size()返回容器中元素的数量
size_t max_size() const noexceptset.max_size()返回容器支持的最大元素数量
std::pair<iterator, bool> insert(const value_type& value)set.insert(value)向容器中插入一个元素
iterator insert(iterator hint, const value_type& value)set.insert(hint, value)在给定位置之前插入一个元素
template < class InputIt> void insert(InputIt first, InputIt last)set.insert(first, last)将指定范围内的元素插入到容器中
iterator erase(iterator pos)set.erase(pos)删除给定位置的元素
size_type erase(const key_type& key)set.erase(key)删除具有给定键值的元素
iterator erase(iterator first, iterator last)set.erase(first, last)删除给定范围内的元素
void swap(set& other)set.swap(other)交换两个集合容器的内容
void clear() noexceptset.clear()清空容器中的所有元素
iterator find(const key_type& key)set.find(key)在容器中查找具有给定键值的元素,并返回指向该元素的迭代器;如果未找到,则返回 end() 迭代器
const_iterator find(const key_type& key) constset.find(key)在容器中查找具有给定键值的元素,并返回指向该元素的只读迭代器;如果未找到,则返回 end() 迭代器
size_type count(const key_type& key) constset.count(key)返回具有给定键值的元素在容器中的个数
iterator lower_bound(const key_type& key)set.lower_bound(key)返回第一个不小于给定键值的元素的迭代器
const_iterator lower_bound(const key_type& key) constset.lower_bound(key)返回第一个不小于给定键值的元素的只读迭代器
iterator upper_bound(const key_type& key)set.upper_bound(key)返回第一个大于给定键值的元素的迭代器
const_iterator upper_bound(const key_type& key) constset.upper_bound(key)返回第一个大于给定键值的元素的只读迭代器
std::pair<iterator, iterator> equal_range(const key_type& key)set.equal_range(key)返回一个 pair 对象,其中包含容器中所有键值等于给定键值的元素范围的起始和结束迭代器
std::pair<const_iterator, const_iterator> equal_range(const key_type& key) constset.equal_range(key)返回一个 pair 对象,其中包含容器中所有键值等于给定键值的只读元素范围的起始和结束迭代器
key_compare key_comp() constset.key_comp()返回用于键值比较的函数对象
value_compare value_comp() constset.value_comp()返回用于值比较的函数对象
iterator begin() noexceptset.begin()返回指向容器中第一个元素的迭代器
const_iterator begin() const noexceptset.begin()返回指向容器中第一个元素的只读迭代器
iterator end() noexceptset.end()返回指向容器中最后一个元素之后位置的迭代器
const_iterator end() const noexceptset.end()返回指向容器中最后一个元素之后位置的只读迭代器
reverse_iterator rbegin() noexceptset.rbegin()返回一个指向容器最后一个元素的逆序迭代器
const_reverse_iterator rbegin() const noexceptset.rbegin()返回一个指向容器最后一个元素的只读逆序迭代器
reverse_iterator rend() noexceptset.rend()返回一个指向容器第一个元素之前位置的逆序迭代器
const_reverse_iterator rend() const noexceptset.rend()返回一个指向容器第一个元素之前位置的只读逆序迭代器
const_iterator cbegin() const noexceptset.cbegin()返回指向容器中第一个元素的只读迭代器(同 begin()
const_iterator cend() const noexceptset.cend()返回指向容器中最后一个元素之后位置的只读迭代器(同 end()
const_reverse_iterator crbegin() const noexceptset.crbegin()返回一个指向容器最后一个元素的只读逆序迭代器(同 rbegin()
const_reverse_iterator crend() const noexceptset.crend()返回一个指向容器第一个元素之前位置的只读逆序迭代器(同 rend()

三、std::multiset

1. std::multiset简介

⭕ 官方文档 > 链接

在这里插入图片描述

std::multiset 是 C++ 标准库中的一个容器,它实现了一个有序的、可重复的元素集合。std::set 不同的是,std::multiset 允许存储多个相同的元素。

std::multiset 的特点包括:

  1. 元素按照升序进行排序,并且插入新元素后仍然保持有序。
  2. 可以存储相同的元素,即允许重复元素存在。
  3. 插入和删除操作都具有对数复杂度。
  4. 支持快速查找、遍历和迭代操作。

与其他容器类似,std::multiset 提供了一系列成员函数来方便地操作集合数据,例如插入元素、删除元素、查找元素等。此外,std::multiset 还提供了迭代器来遍历集合中的元素,并且可以使用自定义的比较函数来指定元素的排序方式。

以下是 std::multiset 常用的一些成员函数:

  • insert: 插入一个元素或者一个范围的元素到 multiset 中。
  • erase: 删除一个元素或者一个范围的元素。
  • find: 在 multiset 中查找指定元素,并返回一个指向该元素的迭代器。
  • count: 计算某个元素在 multiset 中的个数。
  • size: 返回元素个数。
  • empty: 检查 multiset 是否为空。
  • clear: 清空 multiset 中的所有元素。
  • beginend: 返回指向第一个元素和最后一个元素之后位置的迭代器,用于遍历 multiset 中的元素。

🚨🚨注意std::multiset 并不支持修改元素的值,因为它保持元素有序的特性。如果需要修改元素的值,可以先从容器中删除该元素,然后再插入修改后的值

下面是一个简单的示例代码,展示了如何使用 std::multiset

#include <iostream>
#include <set>int main() {std::multiset<int> numbers;// 插入元素numbers.insert(5);numbers.insert(2);numbers.insert(7);numbers.insert(5); // 允许插入重复元素// 遍历输出元素for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 查找元素auto it = numbers.find(5);if (it != numbers.end()) {std::cout << "找到元素 " << *it << std::endl;}// 删除元素numbers.erase(2);// 输出剩余的元素数量std::cout << "剩余元素个数:" << numbers.size() << std::endl;return 0;
}

输出结果:

2 5 5 7
找到元素 5
剩余元素个数:3

🔴在使用上面与std::map的使用方法以及函数类型都一样,这里我就不再过多的赘述了。(详细的说明可以看官方文档的介绍)

四、std::set与std::multiset的比较

相同点

  1. 容器类型:它们都是关联容器,用于存储一组按照特定顺序排列的元素。
  2. 元素的访问:它们提供了类似于容器的访问方式,可以使用迭代器进行遍历,还可以直接访问指定位置的元素。
  3. 迭代器支持:它们都支持正向迭代器,可以用于遍历元素。

不同点

  1. 元素唯一性:

    • std::set 中每个元素都是唯一的,容器中不允许出现重复的元素。
    • std::multiset 允许存储多个相同的元素,可以在容器中存储重复的元素。
  2. 排序:

    • std::set 中的元素是按照升序进行排序的,默认使用 < 运算符进行比较。
    • std::multiset 也对元素进行排序,但与 std::set 不同的是,它允许存储相同的元素,因此可以有多个相同的元素按照顺序存储。
  3. 插入操作:

    • std::set 插入重复的元素将被忽略,只有第一个插入的元素会被保留。
    • std::multiset 插入重复的元素会将所有的元素都保留。
  4. 查找操作:

    • std::set 提供的查找函数返回的迭代器指向找到的元素或者尾后迭代器(如果未找到)。
    • std::multiset 提供的查找函数返回的迭代器指向第一个匹配的元素。
  5. 删除操作:

    • std::set 中删除一个元素将删除所有与之相等的元素。
    • std::multiset 中删除一个元素只会删除一个匹配的元素。

如何选择set 和 multiset

  • 如果需要保持元素的唯一性并进行快速查找,可以选择 std::set
  • 如果需要允许重复的元素,并按照顺序进行存储和查找,可以选择 std::multiset

温馨提示

感谢您对博主文章的关注与支持!另外,我计划在未来的更新中持续探讨与本文相关的内容,会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!中秋快乐!
在这里插入图片描述

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

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

相关文章

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境 因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境&#xff0c;可以参考文章&#xff1a; 详解如何使用VS code搭建JavaScript环境&#xff08;适合小白&#xff09;_vscode配置javascri…

[NOIP2006]明明的随机数

一、题目 登录—专业IT笔试面试备考平台_牛客网 二、代码 set去重&#xff0c;再利用vector进行排序 std::set是一个自带排序功能的容器&#xff0c;它已经按照一定的规则&#xff08;默认是元素的小于比较&#xff09;对元素进行了排序。因此&#xff0c;你不能直接对std::s…

Node.js与npm的准备与操作

1.下载 Node.js官网&#xff1a;Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 打开后的界面如下&#xff1a; LTS&#xff08;Long Term Support&#xff09;&#xff1a;长期支持版&#xff0c;稳定版 Current&am…

Vim 一下日志文件,Java 进程没了?

一次端口告警&#xff0c;发现 java 进程被异常杀掉&#xff0c;而根因竟然是因为在问题机器上 vim 查看了 nginx 日志。下面我将从时间维度详细回顾这次排查&#xff0c;希望读者在遇到相似问题时有些许启发。 时间线 15:19 收到端口异常 odin 告警。 状态:P1故障 名称:应用端…

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB在实战项目中替换Milvus测试

为什么尝试使用Tencent Cloud VectorDB替换Milvus向量库&#xff1f; 亮点&#xff1a;Tencent Cloud VectorDB支持Embedding&#xff0c;免去自己搭建模型的负担&#xff08;搭建一个生产环境的模型实在耗费精力和体力&#xff09;。 腾讯云向量数据库是什么&#xff1f; 腾…

【SwiftUI】7.预览及其内部机制

上一篇讲到了组件及组件化&#xff0c;从概念和优/缺点两个方向说明了组件化的意义&#xff0c;更为重要的是&#xff0c;组件和组件化是一个在编程领域&#xff0c;放之四海皆可以的概念&#xff0c;理解和运用它是非常必要的&#xff0c;希望大家能掌握。今天我们介绍另一个特…

卸载软件最最最彻底的工具——Uninstall Tool

卸载软件最最最彻底的工具——Uninstall Tool Uninstall Tool 是一款功能强大的专业卸载工具。针对一些普通卸载不彻底的问题&#xff0c;它可以做到最优&#xff0c;比如Matlab等软件的卸载难的问题也可以较好地解决。 它比 Windows 自带的“添加/删除程序”功能快 3 倍&…

GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF

GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHF 文章目录 GPT实战系列-GPT训练的Pretraining&#xff0c;SFT&#xff0c;Reward Modeling&#xff0c;RLHFPretraining 预训练阶段Supervised FineTuning &#xff08;SFT&#x…

ChatGLM2-6B微调过程说明文档

参考文档&#xff1a; ChatGLM2-6B 微调(初体验) - 知乎 环境配置 下载anaconda&#xff0c;版本是Anaconda3-2023.03-0-Linux-x86_64.sh&#xff0c;其对应的python版本是3.10&#xff0c;试过3.7和3.11版本的在运行时都报错。 执行下面的命令安装anaconda sh Anaconda3-202…

【自主探索】基于 frontier_exploration 的单个机器人自主探索建图

文章目录 一、概述1、功能2、要求 二、使用方法1、用于运行演示2、用于开发人员2.1. 探索无/地图数据2.2. 使用 /map 数据进行探索 三、提供的组件1、explore_client1.1. 调用的操作1.2. 订阅主题1.3. 发布主题 2、explore_server2.1. 提供的操作2.2. 调用的操作2.3. 调用的服务…

计算机图形学-变换基础

坐标系转换历程模型坐标系 -> 世界坐标系 -> 摄像机坐标系 -> 视口&#xff08;屏幕&#xff09;坐标系 变换 仿射变换和线性变换线性&#xff1a;旋转 缩放 镜像 切变放射&#xff1a; 平移 平移 2D变换矩阵 3D变换矩阵 旋转 2D旋转矩阵 //2D 旋转private (float,…

电路 buck-boost相关知识

BUCK-BOOST 文章目录 BUCK-BOOST前言一、DC-DC工作模式电容电感特性伏秒积平衡原理 二、BUCK电路三、BOOST电路四、BUCK-BOOST电路总结 前言 最近需要用到buck-boost相关的电路知识&#xff0c;于是便写下这篇文章复习一下。 一、DC-DC 在学习buck-boost电路之前我们先来看一…

TCP /UDP协议的 socket 调用的过程

在传输层有两个主流的协议 TCP 和 UDP&#xff0c;socket 程序设计也是主要操作这两个协议。这两个协议的区别是什么呢&#xff1f;通常的答案是下面这样的。 TCP 是面向连接的&#xff0c;UDP 是面向无连接的。TCP 提供可靠交付&#xff0c;无差错、不丢失、不重复、并且按序…

独乐乐不如众乐乐(二)-某汽车零部件厂商IC EMC企业规范

前言&#xff1a;该汽车零部件厂商关于IC EMC的规范可能是小编看过的企业标准里要求最明确的一份企业标准了&#xff0c;充分说明了标准方法不是死的&#xff0c;可以灵活应用。 先看看这份规范的抬头&#xff1a; 与其他企业规范一样&#xff0c;该汽车零部件厂商的IC EMC规范…

C语言之内存函数

C语言之内存函数 文章目录 C语言之内存函数1. memcpy 使⽤和模拟实现1.1 memcpy 函数的使用1.3 memcpy的模拟实现 2. memmove 使⽤和模拟实现2.1 memmove 函数的使用2.2 memmove的模拟实现 3. memset 函数的使用4. memcmp 函数的使⽤ 1. memcpy 使⽤和模拟实现 函数声明如下&a…

2023最全的自动化测试入门基础知识(超详细~)

1)首先&#xff0c;什么是自动化测试&#xff1f; 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c;在设计了测试用例并通过评审之后&#xff0c;由测试人员根据测试用例中描述的过程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。…

【双十一特辑】爱心代码(程序员的浪漫)-李峋

前言 最近《点燃我温暖你》中李峋的爱心代码超级火&#xff0c;看着特别心动&#xff0c;这不&#xff0c;光棍节快到了&#xff0c;给兄弟们教学一波爱心代码&#xff0c;赶在双十一前表白&#xff0c;让这个双十一不在是孤单一个人&#xff01; 目录 前言 C语言简易爱心代码…

0002Java程序设计-springboot在线考试系统小程序

文章目录 **摘 要****目录**系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 本毕业设计的内容是设计并且实现一个基于springboot的在线考试系统小程序。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&…

Java 图片验证码需求分析

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 图片验证码 需求分析 连续因输错密码而登录失败时&#xff0c;记录其连续输错密码的累加次数&#xff1b;若在次数小于5时&#xff0c;用户输入正确的密码并成功登录…

微服务负载均衡器Ribbon

1.什么是Ribbon 目前主流的负载方案分为以下两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如 F5&#xff09;&#xff0c;也有软件的&#xff08;比如 Nginx&#xff09;。 客户端根据…