C/C++ | 每日一练 (4)

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • C/C++ | 每日一练 (4)
    • 题目
    • 参考答案
      • 基础容器
        • 序列容器
          • `std::array`
          • `std::vector`
          • `std::deque`
          • `std::list`
          • `std::forward_list`
        • 关联容器
          • 有序关联容器
            • `std::set`
            • `std::map`
            • `std::multiset`
            • `std::multimap`
          • 无序关联容器
            • `std::unordered_set`
            • `std::unordered_map`
            • `std::unordered_multiset`
            • `std::unordered_multimap`
      • 容器适配器
        • `std::stack`
        • `std::queue`
        • `std::priority_queue`

C/C++ | 每日一练 (4)

题目

c++STL 常见容器有哪些?简述一下底层实现的原理。

参考答案

c++ 中根据容器的特点和结构分为如下两大类:

  • 基础容器
  • 容器适配器

下面基于以上列举的两大类型进行一一总结。

基础容器

c++ 标准库中,基础容器是构建其他容器(如容器适配器)的底层实现,它们提供了丰富的数据存储和管理功能。

基础容器主要分为两大类:序列容器和关联容器

序列容器

序列容器用于存储线性排列的元素,支持随机访问或顺序访问。它们的特点是元素的顺序由插入顺序决定。

c++ 标准库中提供的序列容器有:std::arraystd::vectorstd::dequestd::liststd::forward_list


std::array

c++11 引入的固定大小的序列容器,底层是静态数组。它的大小在编译时确定,因此不支持动态大小。

例如:

#include <iostream>
#include <array>int main()
{std::array<int, 5> arr = {1, 2, 3, 4, 5};// 访问元素std::cout << arr[2] << std::endl; // 3// 修改元素arr[2] = 10;std::cout << arr[2] << std::endl; // 10// 因为 array 是固定大小的容器,不能动态增加、删除元素// 遍历for (int i : arr){std::cout << i << " "; // 1 2 10 4 5}std::cout << std::endl;return 0;
}
std::vector

底层是基于动态数组实现,支持随机访问。它在内存中分配一块连续的空间来存储元素,当容器中的元素数量超过当前分配的空间时,会触发扩容机制,扩容因子根据不同的标准库实现有不同的大小,目前是存在1.5倍和2倍的大小。

例如:

#include <iostream>
#include <vector>int main()
{std::vector<int> vec = {1, 2, 3, 4, 5};// 访问元素std::cout << vec[2] << std::endl; // 3// 修改元素vec[2] = 10;std::cout << vec[2] << std::endl; // 10// 在末尾添加元素vec.push_back(6);std::cout << vec.back() << std::endl; // 6// 删除最后一个元素vec.pop_back();std::cout << vec.size() << std::endl; // 5// 遍历for (int i : vec){std::cout << i << " "; // 1 2 10 4 5}std::cout << std::endl;return 0;
}
std::deque

std::deque的底层结构可以看作是一个指针数组,其中每个指针指向一个固定大小的缓冲区(称为块)。这些块组成了整个 std::deque的数据存储。通过这种结构,std::deque可以在头尾进行高效的插入和删除操作,同时也能提供快速的随机访问。

  • 指针数组std::deque 使用一个数组来存储指向各个数据块(缓冲区)的指针。这个指针数组是连续的,即指针存储在一个连续的数组中。
  • 数据块(缓冲区):每个指针指向一个固定大小的缓冲区,这些缓冲区用于实际存储数据。缓冲区中的数据是连续存储的,但是缓冲区之间在内存中可能不是连续的。其中每个数据块大小是 4096 / sizeof(T)(其中 T是存储的类型)

例如:

#include <iostream>
#include <deque>int main()
{std::deque<int> dq = {1, 2, 3, 4, 5};// 访问元素std::cout << dq[2] << std::endl; // 3// 修改元素dq[2] = 10;std::cout << dq[2] << std::endl; // 10// 在头部和尾部添加元素dq.push_front(0);dq.push_back(6);std::cout << dq.front() << " and " << dq.back() << std::endl; // 0 and 6// 删除头部和尾部元素dq.pop_front();dq.pop_back();std::cout << dq.size() << std::endl; // 5// 遍历for (int i : dq){std::cout << i << " "; // 1 2 10 4 5}std::cout << std::endl;return 0;
}
std::list

双向链表,每个元素包含一个数据域和两个指针(分别指向前后元素)。它不依赖连续的内存空间。std::list 的大小可以动态增加或减少,允许在常数时间内插入或删除元素(只需调整指针)。另外 std::list 不支持随机访问,访问元素时需要从链表头或尾开始遍历。

例如:

#include <iostream>
#include <list>int main()
{std::list<int> lst = {1, 2, 3, 4, 5};// 访问第一个元素std::cout << lst.front() << std::endl; // 1// 修改第一个元素lst.front() = 10;std::cout << lst.front() << std::endl; // 10// 在头部和尾部添加元素lst.push_front(0);lst.push_back(6);std::cout << lst.front() << " and " << lst.back() << std::endl; // 0 and 6// 删除第一个和最后一个元素lst.pop_front();lst.pop_back();std::cout << lst.size() << std::endl; // 5// 遍历for (int i : lst){std::cout << i << " "; // 10 2 3 4 5}std::cout << std::endl;return 0;
}
std::forward_list

单向链表,每个元素只包含一个数据域和一个指针(指向后元素),只能单向遍历。与 std::list 一样不依赖于连续的内存空间,可以在常数时间内操作元素(调整指针),也同样不支持随机访问,访问元素时需要从链表头或尾开始遍历。

例如:

#include <iostream>
#include <forward_list>int main()
{std::forward_list<int> flst = {1, 2, 3, 4, 5};// 访问第一个元素std::cout << flst.front() << std::endl; // 1// 修改第一个元素flst.front() = 10;std::cout << flst.front() << std::endl; // 10// 在头部添加元素flst.push_front(0);std::cout << flst.front() << std::endl; // 0// 删除第一个元素flst.pop_front();std::cout << flst.front() << std::endl; // 10// 遍历for (int i : flst){std::cout << i << " "; // 10 2 3 4 5}std::cout << std::endl;return 0;
}
关联容器

c++ 标准库中,关联容器是一类特殊的容器,用于存储键值对,并根据键的值自动组织数据。

c++ 标准库提供了两种主要的关联容器类型,如下所示:

  • 有序关联容器:std::setstd::mapstd::multisetstd::multimap
  • 无序关联容器:std::unordered_setstd::unordered_mapstd::unordered_multisetstd::unordered_multimap

有序关联容器
std::set

存储唯一的键,所有元素按照键的顺序自动排序。std::set 底层使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <set>int main()
{std::set<int> mySet;// 增:插入元素mySet.insert(10);mySet.insert(20);mySet.insert(30);mySet.insert(20); // 重复元素不会插入// 查找元素auto it = mySet.find(20);if (it != mySet.end()){std::cout << *it << std::endl; // 20}else{std::cout << "Not found!" << std::endl;}// set 的键值不可直接修改,需要删除后重新插入mySet.erase(it);  // 删除元素mySet.insert(25); // 插入新值// 删除元素mySet.erase(30);// 遍历for (const auto &value : mySet){std::cout << value << " "; // 10 25}std::cout << std::endl;return 0;
}
std::map

以键值对的形式存储数据,键唯一,并且所有元素都按键的顺序自动排序。std::map 底层使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <map>int main()
{std::map<int, std::string> myMap;// 插入键值对myMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 通过键访问值std::cout << myMap[2] << std::endl; // two// 修改键对应的值myMap[2] = "TWO";std::cout << myMap[2] << std::endl; // TWO// 删除键值对myMap.erase(3);// 遍历// 1: one// 2: TWO// for (const auto &[key, value] : myMap)// {//     std::cout << key << ": " << value << std::endl;// }for (const auto &it : myMap){std::cout << it.first << ": " << it.second << std::endl;}return 0;
}
std::multiset

用于存储多个键,允许重复元素,并且所有元素按照键的顺序自动排序。std::multiset 使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <set>int main()
{std::multiset<int> myMultiSet;// 插入元素myMultiSet.insert(10);myMultiSet.insert(20);myMultiSet.insert(20);myMultiSet.insert(30);// 查找元素auto it = myMultiSet.find(20);if (it != myMultiSet.end()){std::cout << *it << std::endl; // 20}else{std::cout << "Not found!" << std::endl;}// multiset 的键值不可直接修改,需要删除后重新插入myMultiSet.erase(it);  // 删除一个元素myMultiSet.insert(25); // 插入新值// 删除所有值为20的元素myMultiSet.erase(20);// 遍历for (const auto &value : myMultiSet){std::cout << value << " "; // 10 25 30}std::cout << std::endl;return 0;
}
std::multimap

以键值对的形式存储数据,允许重复元素,并且所有元素都按键的顺序自动排序。std::multimap 底层使用红黑树实现,因此具有高效的插入、删除和查找操作。

例如:

#include <iostream>
#include <map>int main()
{std::multimap<int, std::string> myMultiMap;// 插入键值对myMultiMap.insert({1, "one"});myMultiMap.insert({2, "two"});myMultiMap.insert({2, "TWO"});myMultiMap.insert({3, "three"});// 查找键对应的值(可能有多个)auto range = myMultiMap.equal_range(2);for (auto it = range.first; it != range.second; ++it){// two// TWOstd::cout << it->second << std::endl;}// 修改某个键值对的值auto it = myMultiMap.find(2);if (it != myMultiMap.end()){it->second = "TWO MODIFIED";}// 删除某个键值对myMultiMap.erase(it);// 遍历// 1: one// 2: TWO// 3: three// for (const auto &[key, value] : myMultiMap)// {//     std::cout << key << ": " << value << std::endl;// }for (const auto &it : myMultiMap){std::cout << it.first << ": " << it.second << std::endl;}return 0;
}
无序关联容器
std::unordered_set

用于存储唯一的键,所有元素不按特定顺序排序。std::unordered_set 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_set>int main()
{std::unordered_set<int> us;// 插入元素us.insert(1);us.insert(2);us.insert(3);// 查找元素auto it = us.find(2);if (it != us.end()){std::cout << *it << std::endl; // 2}else{std::cout << "Not found!" << std::endl;}// unordered_set 不支持直接修改键,只能删除后重新插入us.erase(it);us.insert(25);// 删除us.erase(1);// 遍历for (const auto &elem : us){std::cout << elem << " "; // 25 3}std::cout << std::endl;return 0;
}
std::unordered_map

以键值对的形式存储数据,键唯一,并且所有元素都不按特定顺序排序。std::unordered_map 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_map>
using namespace std;int main()
{unordered_map<int, string> um;// 插入键值对um[1] = "one";um[2] = "two";um[3] = "three";// 通过键访问值std::cout << um[2] << std::endl; // two// 修改键对应的值um[2] = "TWO";std::cout << um[2] << std::endl; // TWO// 删除键值对um.erase(3);// 遍历for (const auto &pair : um){// 2: TWO// 1: onecout << pair.first << ": " << pair.second << endl;}return 0;
}
std::unordered_multiset

用于存储键,允许相同的元素出现多次,所有元素不按特定顺序排序。std::unordered_multiset 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_set>int main()
{std::unordered_multiset<int> ums;// 插入元素ums.insert(1);ums.insert(2);ums.insert(2);ums.insert(3);// 查找元素auto range = ums.equal_range(2);std::cout << std::distance(range.first, range.second) << std::endl; // 2// unordered_multiset 不支持直接修改键,只能删除后重新插入ums.erase(1);ums.insert(10);// 删除所有值为2的元素ums.erase(2);// 遍历for (const auto &elem : ums){std::cout << elem << " "; // 10 3}std::cout << std::endl;return 0;
}
std::unordered_multimap

以键值对的形式存储数据,允许相同的键值出现多次,每个键可以对应多个值(键值对),并且所有元素都不按特定顺序排序。std::unordered_multimap 底层使用哈希表实现,因此具有常数时间复杂度的插入、删除和查找操作。

例如:

#include <iostream>
#include <unordered_map>int main()
{std::unordered_multimap<int, std::string> umm;// 插入键值对umm.insert({1, "one"});umm.insert({2, "two"});umm.insert({2, "TWO"});umm.insert({3, "three"});// 查找键对应的值(可能有多个)auto range = umm.equal_range(2);std::cout << distance(range.first, range.second) << std::endl; // 2for (auto it = range.first; it != range.second; ++it){std::cout << it->second << " "; // TWO two}std::cout << std::endl;// 修改某个键值对的值auto it = umm.find(2);if (it != umm.end()){it->second = "TWO_UPDATED";}// 删除某个键值对umm.erase(3);// 遍历for (const auto &pair : umm){// 2: TWO_UPDATED// 2: two// 1: onestd::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

容器适配器

容器适配器是一种特殊的容器,它们基于标准容器(如std::vectorstd::dequestd::list等),通过封装和限制其接口来提供特定的抽象数据类型。容器适配器并不直接存储数据,而是通过底层容器来数据存储,并且只暴露部分功能,以满足特定的使用场景。

c++ 标准库中提供了三个容器适配器:std::stackstd::queuestd::priority_queue


std::stack

后进先出(LIFO)的数据结构,支持在栈顶插入和删除元素。默认基于 std::deque 实现,可以使用 std::vectorstd::list 作为底层容器

template<typename _Tp, typename _Sequence = deque<_Tp> >
class stack { //...
}

例如:

#include <iostream>
#include <stack>
#include <vector>
#include <list>int main()
{std::stack<int> s;// 使用 std::vector// std::stack<int, std::vector<int>> s1;// 使用 std::list// std::stack<int, std::list<int>> s2;// 插入元素s.push(1);s.push(2);s.push(3);// 查询栈顶元素std::cout << s.top() << std::endl; // 3// 弹出栈顶元素s.pop();std::cout << s.top() << std::endl; // 输出新栈顶元素的值    2// 判断栈是否为空if (!s.empty()){std::cout << "stack is not empty" << std::endl; // stack is not empty}// 获取栈的大小std::cout << s.size() << std::endl; // 2return 0;
}
std::queue

先进先出(FIFO)的数据结构,支持在队尾插入元素,在队头删除元素。默认基于 std::deque 实现,可以使用 std::list 作为底层容器

template<typename _Tp, typename _Sequence = deque<_Tp> >
class queue
{// ...
}

需要注意的是:std::vector 是一个动态数组,支持快速的尾部插入和删除操作(push_backpop_back),但不支持高效的头部删除操作(pop_front)。因此, std::vector 无法作为 std::queue 的底层容器。

例如:

#include <iostream>
#include <queue>
#include <list>int main()
{std::queue<int> q;// 使用 std::list// std::queue<int, std::list<int>> q1;// 元素入队q.push(1);q.push(2);q.push(3);// 输出队头元素std::cout << q.front() << std::endl; // 1// 输出队尾元素std::cout << q.back() << std::endl; // 3// 元素出队q.pop();std::cout << q.front() << std::endl; // 2// 判断队列是否为空if (!q.empty()){std::cout << "queue is not empty" << std::endl; // queue is not empty}// 获取队列的大小std::cout << "queue size: " << q.size() << std::endl; // queue size: 2return 0;
}
std::priority_queue

优先队列,元素会按照优先级顺序排(默认是大顶堆,如果需要小顶堆,则需要自定义比较器)。默认基于 std::vector 作为底层容器,可以使用 std::deque 作为底层容器

template<typename _Tp, typename _Sequence = vector<_Tp>,typename _Compare  = less<typename _Sequence::value_type> >
class priority_queue
{// ...
}

需要注意的是:std::list 只支持双向迭代器,不支持随机访问。而优先队列需要上浮和下沉操作(需要随机访问的支持),所以 std::list 无法作为 std::priority_queue 的底层容器。

例如:

#include <iostream>
#include <queue>
#include <deque>int main()
{std::priority_queue<int> pq;// std::priority_queue<int, std::deque<int>> pq;// 堆中插入元素pq.push(1);pq.push(3);pq.push(2);// 查询堆顶元素std::cout << pq.top() << std::endl; // 3// 删除堆顶元素pq.pop();std::cout << pq.top() << std::endl; // 2// 判断堆是否为空if (!pq.empty()){// priority queue is not emptystd::cout << "priority queue is not empty" << std::endl; }// 获取优先队列的大小// priority queue size: 2std::cout << "priority queue size: " << pq.size() << std::endl; return 0;
}

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

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

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

相关文章

HarmonyOS 5.0应用开发——鸿蒙接入高德地图实现POI搜索

【高心星出品】 文章目录 鸿蒙接入高德地图实现POI搜索运行结果&#xff1a;准备地图编写ArkUI布局来加载HTML地图 鸿蒙接入高德地图实现POI搜索 在当今数字化时代&#xff0c;地图应用已成为移动设备中不可或缺的一部分。随着鸿蒙系统的日益普及&#xff0c;如何在鸿蒙应用中…

Linux系统:服务器常见服务默认IP端口合集

服务器的默认IP端口取决于所使用的协议和服务类型。以下是一些常见服务和协议的默认端口&#xff1a; 服务端口实例&#xff1a; HTTP服务 默认端口&#xff1a;80 说明&#xff1a;用于普通的HTTP网页访问。例如&#xff0c;访问 http://example.com 时&#xff0c;默认使用8…

一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格&#xff0c;用于比较Flask中的…

学习路程四 向量数据库Milvus安装与连接

前序 在之前&#xff0c;已经简单完成了文档的加载&#xff0c;分割&#xff0c;向量化这些步骤&#xff0c;最后得到了结果。但是这些数据都是一次性的。假设一个律师所&#xff0c;有几千上万份卷宗&#xff0c;不可能每次使用都重新向量化数据吧。 所以我们需要有一个地方存…

Docker 搭建 Nginx 服务器

系列文章目录 Docker 搭建 Nginx 服务器 系列文章目录前言一、准备工作二、设置 Nginx 容器的目录结构三、启动一个临时的 Nginx 容器来复制配置文件四、复制 Nginx 配置文件到本地目录五、删除临时 Nginx 容器六、创建并运行 Nginx 容器&#xff0c;挂载本地目录七、修改 ngin…

centos9安装k8s集群

以下是基于CentOS Stream 9的Kubernetes 1.28.2完整安装流程&#xff08;containerd版&#xff09;&#xff1a; 一、系统初始化&#xff08;所有节点执行&#xff09; # 关闭防火墙 systemctl disable --now firewalld# 关闭SELinux sed -i "s/SELINUXenforcing/SELINU…

WebSocket connection failed 解决

WebSocket connection failed 解决 前言 这里如果是新手小白不知道 WebSocket 是什么的&#xff1f; 怎么使用的&#xff1f;或者想深入了解的 那可以 点击这里 几分钟带你快速了解并使用&#xff0c;已经一些进阶讲解&#xff1b; WebSocket&#xff0c;多应用于需要双向数据…

基于大数据爬虫数据挖掘技术+Python的线上招聘信息分析统计与可视化平台(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringB…

java给钉钉邮箱发送邮件

1.开通POP和IMAP 2.引入pom <dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version> </dependency>3.逻辑 String host "smtp.qiye.aliyun.com"; String port "…

五、AIGC大模型_04LLaMA-Factory基础知识与SFT实战

1、LLaMA-Factory 基本介绍 1.1 定义 LLaMA-Factory 是一个开源的大型语言模型&#xff08;LLM&#xff09;微调框架&#xff0c;旨在帮助开发者和研究人员轻松地对预训练语言模型进行定制化训练和优化 1.2 功能特点 支持多种预训练模型 LLaMA Factory 支持超过 100 种主流的…

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断 目录 故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断分类效果基本介绍模型描述DBO-BP-Bagging蜣螂算法优化多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目的与方法 二…

和Claude对战黑白棋!一起开发AI对弈游戏

序言 为了提升自己的多模态处理能力和API调用技巧&#xff0c;我决定挑战一个有趣的项目——开发一款可以与Claude对战的黑白棋游戏&#xff01;这个项目不仅涉及游戏逻辑的实现&#xff0c;还需要调用Claude的API&#xff0c;让AI作为对手进行博弈。通过这个过程&#xff0c;…

R-INLA实现绿地与狐狸寄生虫数据空间建模:含BYM、SPDE模型及PC先验应用可视化...

全文链接&#xff1a;https://tecdat.cn/?p40720 本论文旨在为对空间建模感兴趣的研究人员客户提供使用R-INLA进行空间数据建模的基础教程。通过对区域数据和地统计&#xff08;标记点&#xff09;数据的分析&#xff0c;介绍了如何拟合简单模型、构建和运行更复杂的空间模型&…

ubuntu20.04安装docker

3台主机&#xff0c;2台都能正确安装&#xff0c;第三台怎么都安装不成功&#xff1b; 3台主机都是一样的配置和系统&#xff1b; 后来看来是其外网的ip不一样&#xff0c;导致第三台主机可能被Qiang&#xff0c;不过错误只是提示签名不正确&#xff0c;在设置签名时好像没有…

【Android】用 chrome://inspect/#devices 调试H5页面

通常做Android开发的过程中&#xff0c;不可避免的需要遇到去与H5交互&#xff0c;甚至有时候需要去调试H5的信息。 这里分享一下Android工程里如何调试H5页面信息&#xff1a; 直接在浏览器地址栏输入 &#xff1a; chrome://inspect/#devices 直接连接手机usb,打开开发者模式…

AI多模态梳理与应用思考|从单文本到多视觉的生成式AI的AGI关键路径

摘要&#xff1a; 生成式AI正从“文本独舞”迈向“多感官交响”&#xff0c;多模态将成为通向AGI的核心路径。更深度的多模态模型有望像ChatGPT颠覆文字交互一样&#xff0c;重塑物理世界的智能化体验。 一、多模态的必然性&#xff1a;从单一到融合 生成式AI的起点是文本生成…

精美登录注册UI,登录页面设计模板

精美登录注册UI,登录页面设计模板 引言 在网页设计中,按钮是用户交互的重要元素之一。一个炫酷的按钮特效不仅能提升用户体验,还能为网页增添独特的视觉吸引力。今天,我们将通过CSS和JavaScript来实现一个“精美登录注册UI,登录页面设计模板”。该素材呈现了数据符号排版…

kotlin 知识点一 变量和函数

在Kotlin中定义变量的方式和Java 区别很大&#xff0c;在Java 中如果想要定义一个变 量&#xff0c;需要在变量前面声明这个变量的类型&#xff0c;比如说int a表示a是一个整型变量&#xff0c;String b表 示b是一个字符串变量。而Kotlin中定义一个变量&#xff0c;只允许在变量…

海洋 CMS V9SQL注入漏洞

目录 禁用information_schema解决方法 方法一&#xff1a;替换法 sys performance_schema ​编辑 方法二&#xff1a;无列名注入 利用lxml模块进行布尔盲注 XPATH XPATH介绍: XPATH语法: 布尔盲注 标准代码&#xff1a; 运行结果&#xff1a; ​编辑 时间盲注 标准代…

springcloud nacos 整合seata解决分布式事务

文章目录 nacos安装Mysql5.7安装及表初始化seata server安装下载并解压seata安装包在conf文件夹修改file.conf文件向本地数据库导入seata需要的表修改registry.conf文件将seata配置信息添加到nacos配置中心启动seata server springcloud整合seata测试流程正常下单流程扣减库存失…