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::array、std::vector、std::deque、std::list、std::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::set、std::map、std::multiset、std::multimap。 - 无序关联容器:
std::unordered_set、std::unordered_map、std::unordered_multiset、std::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::vector、std::deque、std::list等),通过封装和限制其接口来提供特定的抽象数据类型。容器适配器并不直接存储数据,而是通过底层容器来数据存储,并且只暴露部分功能,以满足特定的使用场景。
c++ 标准库中提供了三个容器适配器:std::stack、std::queue、std::priority_queue。
std::stack
后进先出(LIFO)的数据结构,支持在栈顶插入和删除元素。默认基于 std::deque 实现,可以使用 std::vector 或 std::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_back 和 pop_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;
}
🌺🌺🌺撒花!
如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

相关文章:
C/C++ | 每日一练 (4)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 C/C | 每日一练 (4)题目参考答案基础容器序列容器std:…...
数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析
数据安全_笔记系列06:数据生命周期管理(存储、传输、使用、销毁)深度解析 数据生命周期管理(存储、传输、使用、销毁)详解 数据生命周期管理(Data Lifecycle Management, DLM)是围绕数据从创建…...
后端返回文件流,前端导出excel文件
1、当后端接口返回文件流时,需前端导出excel文件,在请求中添加 responseType: blob限制条件,根据返回的文件流导出 封装的方法: /** * 公共的导出excel方法 * param {*} content 后端接口返回的二进制文件 * param {*} name 导出…...
Python开发 Flask框架面试题及参考答案
目录 Flask 的核心设计理念是什么?与 Django 相比有哪些显著差异? 解释 Flask 框架的核心理念及其作为 “微框架” 的优缺点 Flask 的依赖库有哪些?简述 Werkzeug 和 Jinja2 的作用 什么是 WSGI?Flask 如何基于 WSGI 实现服务端与应用的交互 解释 RESTful API 的设计原…...
Python 3.11 69 个内置函数(完整版)
一、数学与数值运算(12个) 函数 说明 示例 abs(x) 绝对值 abs(-5)→ 5 divmod(a, b) 返回(a//b, a%b) divmod(7,3)→ (2,1) max(iterable) 最大值 max([1,2,3])→ 3 min(iterable) 最小值 min([1,2,3])→ 1 pow(a, b) a^b(等…...
蓝桥杯备考:贪心算法之矩阵消除游戏
这道题是牛客上的一道题,它呢和我们之前的排座位游戏非常之相似,但是,排座位问题选择行和列是不会改变元素的值的,这道题呢每每选一行都会把这行或者这列清零,所以我们的策略就是先用二进制把选择所有行的情况全部枚举…...
跳跃游戏两则
跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 思路 这里只…...
机器视觉--相机曝光
在现代工业生产的精密舞台上,机器视觉技术已然成为推动生产自动化、智能化的关键力量。而工业相机作为机器视觉系统的 “眼睛”,其曝光环节更是决定了视觉信息获取的质量与精度,如同为工业生产赋予了一双洞察入微的 “智慧之眼”,…...
基于 CFD 预测的机器学习第 2 部分:在 Benchmark 应用程序上使用 Stochos 预测流场
了解机器学习和 Stochos 如何彻底改变制造业的 CFD 预测。 挑战 预测复杂流体动力学场景中的流场一直是工程师和科学家面临的重大挑战。传统的计算流体动力学 (CFD) 方法需要大量的计算资源和时间,因此难以处理实时预测和大规模模拟。 此外…...
批量导出数据库表到Excel
这篇文章将介绍如何批量的将多个甚至成千上万的数据库表导出为Excel文件。 准备数据 如下图是数据库里的表,我们需要将它们全部导出为excel文件,这里以SQL Server数据库为例 新增导出 打开的卢导表工具,新建数据库连接,这里以S…...
力扣提升第一天
力扣提升第一天 题目链接:https://leetcode.cn/problems/design-memory-allocator/?envTypedaily-question&envId2025-02-25 一开始解题思路 暴力解决法 我奔着先从简单的写法做起,之后再想办法进行改进,心里已经预料到会出现超出时间…...
uni-app 开发 App 、 H5 横屏签名(基于lime-signature)
所用插件:lime-signature 使用到 CSS 特性 绝对定位transform 旋转transform-origin transform 原点 复习一下定位元素(相对定位、绝对定位、粘性定位) 代码# <template><view class"signature-page"><view clas…...
【Python】Python顺序语句经典题(四)
Python顺序语句经典练习题例题(四)。题目来源:Acwing 前三期合集:【Python】Python顺序语句经典题合集-CSDN博客 目录 1.最大值 题目描述 解题思路 AC代码 2.距离 题目描述 AC代码 3.燃料消耗 题目描述 AC代码 4.钞票…...
mysql的字符集和比较规则
mysql的字符集和比较规则 一、字符集(Character Set)二、比较规则(Collation)三、客户端与服务器的字符集转换四、注意事项总结 深度解读mysql是怎样运行的 MySQL的字符集和比较规则是其处理字符串存储、传输及比较的核心机制&…...
Vue3 + Vite + TS,使用 配置项目别名属性:server
官网地址传送门 点哇点哇,vite 官网传送门 直接上马 server: {https: false, // 是否开启 httpsopen: true, // 是否自动在浏览器中打开port: 8001, // 端口号host: "0.0.0.0",// 跨域代理proxy: {/api: {target: "http://localhost:3000", …...
03_pyqt5 + vlc 实现视频播放器
1.功能需求如图 按钮: 播放/暂停, 前进/后退, 视频上一个/下一个, 打开视频进度条: 视频进度条显示, 进度条拖拽, 音量控制按键控制: 1,2,3,4缩放画面大小, 2.方案选择 开发语言: python UI界面: pyqt5 qt_designed 设计ui布局 视频编码: python-vlc 方案说明: 视频解码可…...
Grafana使用日志5--如何重置Grafana密码
背景 有时候当账号太多的时候,根本记不住所有的账号密码,这时候就很容易登录失败,这时候怎么办呢? 接下来就让我来给大家演示一下Grafana的账号如果忘记了的话,该怎么找回自己的账号密码 操作 让我们来看一下具体的…...
使用 pytest-mock 进行 Python 高级单元测试与模拟
一、单元测试与模拟的意义 在软件开发中,单元测试用于验证代码逻辑的正确性。但实际项目中,代码常依赖外部服务(如数据库、API、文件系统)。直接测试这些依赖会导致: 测试速度变慢测试结果不可控产生副作用(如真实发送邮件)模拟(Mocking) 技术通过创建虚拟对象替代真…...
索提诺比率(Sortino Ratio):更精准的风险调整收益指标(中英双语)
索提诺比率(Sortino Ratio):更精准的风险调整收益指标 📉📊 📌 什么是索提诺比率? 在投资分析中,我们通常使用 夏普比率(Sharpe Ratio) 来衡量风险调整后的…...
prometheus+node_exporter+grafana监控K8S信息
prometheusnode_exportergrafana监控K8S 1.prometheus部署2.node_exporter部署3.修改prometheus配置文件4.grafana部署 1.prometheus部署 包下载地址:https://prometheus.io/download/ 将包传至/opt 解压 tar xf prometheus-2.53.3.linux-amd64.tar.gz 移动到…...
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决
IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时,有时即使关闭了应用,程序仍然占用端口(例如:4001 端口)。这会导致重新启动应用时出现端口被占用的错误&a…...
kafka的ACL配置的sasl.kerberos.principal.to.local.rules配置解释
kafka配置acl认证的用户名转换规则 1、Kerberos中的介绍2、自定义sasl user name3、自定义ssl 的用户名4、关于kafka配置kerberos以及开启acl的实践 1、Kerberos中的介绍 Kerberos 关于此配置项的解释 https://web.mit.edu/Kerberos/krb5-latest/doc/admin/conf_files/krb5_co…...
山东大学软件学院nosql实验三
实验题目: 用Java做简单查询(2学时) 实验内容 用API方式,做简单查询。 实验要求 在以下要求中选择至少2个,使用Java语言实现数据查询,最终把数据输出到前端界面。 (1)找出年龄小于20岁的所有学生 &…...
Feign 类型转换问题解析:如何正确处理 `ResponseEntity<byte[]>` 返回值
在微服务架构中,Feign 是一种常见的用于服务间调用的客户端,它允许我们通过声明式接口来调用远程服务。使用 Feign 时,我们通常通过接口方法的返回类型来接收服务的响应体。然而,某些情况下,我们会遇到 Feign 无法正确解析响应体类型的问题,尤其是当服务返回一个如 Respo…...
零样本学习 zero-shot
1 是什么 2 如何利用零样本学习进行跨模态迁移? demo代码 安装clip pip install ftfy regex tqdm pip install githttps://github.com/openai/CLIP.git import torch import clip from PIL import Image# 加载 CLIP 模型 device "cuda" if torch.cuda.i…...
《深度学习实战》第3集:循环神经网络(RNN)与序列建模
第3集:循环神经网络(RNN)与序列建模 引言 在深度学习领域,处理序列数据(如文本、语音、时间序列等)是一个重要的研究方向。传统的全连接网络和卷积神经网络(CNN)难以直接捕捉序列中…...
mac下载MAMP6.8.1
因为mac的小皮面板没有php7.4了 链接:c9cc270e6961c17c.dmg官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 鹅选一 附上大佬写的教程:MAMP PRO教程 - 牛奔 - 博客园...
动态表头导出EasyExcel
在 Spring Boot 中结合 EasyExcel 实现动态表头导出(无实体类,表头和字段(前端传表名,字段值动态查询,返回List<Map<String,Object>>)由前端传递)可以通过以下步骤实现。以下是完整…...
Python常见面试题的详解16
1. 如何强行关闭客户端和服务器之间的连接? 在网络编程中,有时需要强行中断客户端和服务器之间的连接。对于基于 TCP 协议的连接,由于其面向连接的特性,需要采取特定的步骤来确保连接被正确关闭;而 UDP 是无连接协议&a…...
BUU41 [GYCTF2020]FlaskApp1【SSTI】
题目: 加密处没啥事,但是解密的地方提交{{7*7}}就会返回报错界面,顺便把代码也爆出来了 text_decode base64.b64decode(text.encode()) 先将字符串 text编码为字节对象,然后使用 base64.b64decode 函数对这个字节对象进行 Base…...
