通过前面的学习,我们已经对C++ STL有了初步了解。然而,STL作为一个庞大复杂的体系,远不止这些内容。接下来,我们将深入探讨STL中的另外两个重要组件——map和set。

        作者的个人gitee:楼田莉子 (riko-lou-tian) - Gitee.com喜欢请点个赞谢谢

目录

        前言——序列式容器和关联式容器

        set的介绍

set的接口介绍

        构造函数和析构函数

        构造函数

        析构函数

        =运算符重载

        迭代器

        正向

        反向

        正向const

        反向const

        容量

        empty

        size

        max_size

        相关函数

        insert

        erase

        swap

        clear

        emplace 

        emplace_hint

        观察者

        key_comp     ​编辑

        value_comp

        操作

        find

        count

        lower_bound

        upper_bound

        equal_range

multiset和set的区别

set相关的习题

        两个数组的交集

        环形链表

map的介绍

        pair结构介绍

map的接口介绍

        构造和析构函数

        构造函数

        析构函数

        =运算符重载

        迭代器

        正向

        反向

        const正向

        const反向

        容量

        empty

        size

        max_size

        访问

        []运算符重载

        at

        相关函数

        insert

       erase

        swap

        clear        ​编辑

        emplace

        emplace_hint

        观察者

        key_comp

        value_comp

        操作

        find

        count        

        lower_bound

        upper_bound

        equal_range

multimap和map的区别

map相关的习题

        随机链表的复制

        前k个高频词汇


        前言——序列式容器和关联式容器

       前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。
        关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是⾮线性结构,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有map/set系列和unordered_map/unordered_set系列。
        本篇中学习的map和set容器底层是红⿊树,红⿊树是⼀颗平衡⼆叉搜索树。set是key搜索场景的结构, map是key/value搜索场景的结构

        set的介绍

        set和multiset的文档:<set> - C++ Reference

        在使用set和multiset的时候要包含头文件<set>和

using namespace std;

        进入set文档我们会发现

        set不允许冗余,multiset允许冗余而不破坏结构

        set的官方文档:set - C++ 参考

       set的介绍

           

        set的声明如下,T就是set底层关键字的类型

template < class T,             // set::key_type/value_type
class Compare = less<T>,         // set::key_compare/value_compare
class Alloc = allocator<T>     // set::allocator_type
> class set;

        set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数

        set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。

        ⼀般情况下,我们都不需要传后两个模版参数。

        set底层是⽤红⿊树实现,增删查效率是 ,迭代器遍历是⾛的搜索树的中序,所以是有序的。O(logN)

set的接口介绍

        构造函数和析构函数

        构造函数

        析构函数

        =运算符重载

        迭代器

        正向

        反向

        正向const

        反向const

        容量

        empty

        size

        max_size

        相关函数

        insert

        erase

        swap

        clear

        emplace 

        emplace_hint

        观察者

        key_comp     

        value_comp

  

        操作

        find

        

void test2()
{set<int>s = { 0,9,1,4,7,2,3,2,5,8,7,8,3,6,9 };s.insert(60);print(s);//set自己的find//时间复杂度O(log(n))auto it=s.find(60);if (it != s.end()){cout << "find 60 success" << endl;}else{cout << "find 60 failed" << endl;}//算法库的find//时间复杂度O(N)auto ret = find(s.begin(), s.end(), 60);if (it != s.end()){cout << "find 60 success" << endl;}else{cout << "find 60 failed" << endl;}
}

        算法库也有find函数,但是算法库的find效率比set的低下。

        结果为:

        multiset中的find中序查找

        count

        

void test3()
{set<int>s = { 0,9,1,4,7,2,3,2,5,8,7,8,3,6,9 };if (s.count(2)){cout << "存在" << " ";}else{cout << "不存在" << " ";}
}

结果为:

        count是为了和multiset区分,因为它有多个。

        lower_bound

        

        upper_bound

        

void test4()
{set<int>s = { 0,9,1,4,7,2,3,2,5,8,7,8,3,6,9,10,21,10,11,18,19 };//找到[3,9]区间的元素删除//>=3auto it1 = s.lower_bound(3);//>3auto it2 = s.upper_bound(9);//打印区间[it1,it2]for (auto it = it1; it != it2; ++it){cout<<*it<<" ";}cout<<endl;//删除区间[it1,it2]s.erase(it1,it2);print(s);/*for (auto it = it1; it != it2; it++){s.erase(it);}*////print(s);
}

结果为:

        equal_range

multiset和set的区别

        multiset和set的使⽤基本完全类似,主要区别点在于multiset⽀持值冗余,那么insert/find/count/erase都围绕着⽀持值冗余有所差异,具体参看下⾯的样例代码理解。

void test5()
{// 相⽐set不同的是,multiset是排序,但是不去重multiset<int> s = { 4,2,7,2,4,8,4,5,4,9 };auto it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;// 相⽐set不同的是,x可能会存在多个,find查找中序的第⼀个int x;cin >> x;auto pos = s.find(x);while (pos != s.end() && *pos == x){cout << *pos << " ";++pos;}cout << endl;// 相⽐set不同的是,count会返回x的实际个数cout << s.count(x) << endl;// 相⽐set不同的是,erase给值时会删除所有的xs.erase(x);for (auto e : s){cout << e << " ";}cout << endl;
}

        结果为:

set相关的习题

        两个数组的交集

        

        老方法:

        先使用快慢指针判断是否有环,随后找到环的入口点

        新方法:

        遍历链表,判断是否在s中,不再就插入,在的第一个就是入口点,如果都不在,就插入了链表结束了都带环,比较两个set,小的++;相等就是交集,同时++。一个遍历就结束了

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {//老方法:太麻烦了//是否带环(双指针)//找环的入口点    //新方法:set<Node*>s;//遍历链表,判断是否在s中//不再就插入,在的第一个就是入口点//如果都不在,就插入了链表结束了都带环set<int> s1(nums1.begin(), nums1.end());set<int> s2(nums2.begin(), nums2.end());//// 因为set遍历是有序的,有序值,依次比较//比较//小的++;相等就是交集,同时++。一个练笔就结束了vector<int> ret;auto it1 = s1.begin();auto it2 = s2.begin();while(it1 != s1.end() && it2 != s2.end()){if(*it1 < *it2){it1++;} else if(*it1 > *it2){it2++;} else{ret.push_back(*it1);it1++;it2++;}} return ret;}
};

        该算法找差集也很合适

        1、小的就是差集。小的++

        2、相等,同时++

        3、一个遍历结束剩下的就是差集

        环形链表

        

        

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {set<ListNode*> s;ListNode* cur = head;while(cur){auto ret = s.insert(cur);if(ret.second == false)return cur;cur = cur->next;} return nullptr;}
};

map的介绍

        map和multimap的官方文档:<地图> - C++参考

        map的介绍

        map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实现,增删查改效率是 O(logN) ,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的

template < class Key,                         // map::key_type
class T,                                     // map::mapped_type
class Compare = less<Key>,                  // map::key_compare
class Alloc = allocator<pair<const Key,T> >//map::allocator_type
> class map;

        pair结构介绍

        map底层的红⿊树节点中的数据,使⽤pair<Key, T>存储键值对数据。
        pair的官方文档:pair - C++ 参考

typedef pair<const Key, T> value_type;
template <class T1, class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair() : first(T1()), second(T2()){}pair(const T1& a, const T2& b) : first(a), second(b){}template<class U, class V>pair(const pair<U, V>& pr) : first(pr.first), second(pr.second){}
};
template <class T1, class T2>
inline pair<T1, T2> make_pair(T1 x, T2 y)
{return (pair<T1, T2>(x, y));
}

map的接口介绍

        构造和析构函数

        构造函数

        

        析构函数

        =运算符重载

        迭代器

        正向

        反向

        const正向

        const反向

        容量

        empty

        

        size

        

        max_size

        

        访问

        []运算符重载

        key在map中就插入;如果不在就查找并修改

        at

        相关函数

        insert

        

       erase

        swap

        

        clear
        

        emplace

        

        emplace_hint

        测试: 

void test1()
{//比较麻烦的构造方式/*pair<string, string>kv1 = {"sort","排序"};pair<string, string>kv2 = { "left","左" };pair<string, string>kv3 = { "right","右" };pair<string, string>kv4 = { "up","上" };pair<string, string>kv5 = { "down","下" };map<string, string> dirt = {kv1, kv2, kv3, kv4, kv5};*///简化的构造方式map<string, string> dirt = { {"sort","排序"}, {"left","左"}, {"right","右"}, {"up","上"}, {"down","下"} };pair<string, string>kv1 = { "sort","排序" };//dirt.insert(kv1);//make_pair()函数来源于pair文档//make_pair()可以自动推导参数类型,不用模板参数dirt.insert(pair<string, string>{ "sort", "排序" });dirt.insert(make_pair("const","常量属性"));//insert()函数可以自动推导参数类型,不用模板参数//隐式类型转换//推荐这种写法dirt.insert({ "volatile","易变性" });//遍历dirt//map<string,string>::iterator it=dirt.begin();auto it = dirt.begin();while (it!= dirt.end()){//pair没有流重载所以不能写*it//可以这样写cout<<(*it).first<<" : "<<(*it).second<<endl;//更推荐这种写法cout << it->first << " : " << it->second << " ";//相当于//cout << it.operator->()->first << " : " << it.operator->()->second << " ";it++;}cout << endl;//范围forfor (auto& kv : dirt){cout << kv.first << " : " << kv.second << endl;}//使用auto&的原因//避免拷贝开销:/*dirt的元素类型是pair<const string, string>每个pair包含两个string对象,每个string可能包含动态分配的堆内存使用引用auto& 直接访问容器内元素,不创建任何副本*/// 内存布局对比:// 容器内元素: [pair1] -> [key_str_data][val_str_data]//              [pair2] -> [key_str_data][val_str_data]// 使用auto&: kv 直接指向容器内元素的内存// 使用auto:   kv 是完整的拷贝(包括所有字符串数据)/*	特性			auto& kv			auto kv拷贝开销	无拷贝(零开销)		每个元素两次深拷贝内存占用	仅指针大小(约8字节)	每个元素两份完整字符串动态内存	不分配新内存			每次迭代分配新内存修改原容器	可修改value				修改无效(副本)循环速度	⚡️ 极快	🐢				极慢(尤其大字符串)推荐指数	★★★★★				★☆☆☆☆(禁止使用)*///更推荐C++17的结构化绑定//auto& [x, y] = kv1;for (auto& [x, y] : dirt){cout<<"x="<<x<<" y="<<y<<" ";}cout<<endl;
}

        观察者

        key_comp

        

        value_comp

        操作

        find

        

        count        

        

        lower_bound

        

        upper_bound

        

        equal_range

        找与key相等的区间[x,y)。

        主要适合于multimap

multimap和map的区别

        multimap和map的使⽤基本完全类似,主要区别点在于multimap⽀持关键值key冗余,那么insert/find/count/erase都围绕着⽀持关键值key冗余有所差异,这⾥跟set和multiset完全⼀样,⽐如find时,有多个key,返回中序第⼀个。其次就是multimap不⽀持[],因为⽀持key冗余,[]就只能⽀持插⼊了,不能⽀持修改。

map相关的习题

        随机链表的复制

        

思路:拷贝节点在原节点后面

        关键的地方在于:copy->random=cur->random->next

        步骤:       

        1、拷贝节点插在原节点后面

        2、原节点random控制新节点的random

        3、将新节点解下来链接到上面

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/class Solution 
{
public:Node* copyRandomList(Node* head) {map<Node*, Node*> nodeMap;Node* copyhead = nullptr,*copytail = nullptr;Node* cur = head;while(cur){if(copytail == nullptr){copyhead = copytail = new Node(cur->val);} else{copytail->next = new Node(cur->val);copytail = copytail->next;} // 原节点和拷⻉节点map kv存储nodeMap[cur] = copytail;cur = cur->next;} // 处理randomcur = head;Node* copy = copyhead;while(cur){if(cur->random == nullptr){copy->random = nullptr;} else{copy->random = nodeMap[cur->random];} cur = cur->next;copy = copy->next;} return copyhead;}
};

        前k个高频词汇

        

        

class Solution
{
public://老方法:stable_sort函数(稳定排序)// 仿函数// struct compare// {//     bool operator()(const pair<string ,int>&kv1,const pair<string ,int>&kv2)//     {//         return kv1.second>kv2.second;//     }// };// vector<string> topKFrequent(vector<string>& words, int k) // {//     map<string ,int>countMap;//     for(auto& str:words)//     {//         //统计次数//         countMap[str]++;//     }//     //数据量很大的时候要建小堆//     //数据量不大用大堆//     //但是这里要按频率所以不建议用小堆//     //用排序和大堆都差不多//     //不可以用sort直接去排序//     //sort要求是随机迭代器,只用string、vector、deque支持//     vector<pair<string,int>>v(countMap.begin(),countMap.end());//     //sort(v.begin(),v.end(),compare());//     //sort不是一个稳定的排序//     stable_sort(v.begin(),v.end(),compare());//稳定的排序算法//     vector<string>ret;//     //取出k个//     for(int i=0;i<k;i++)//     {//         ret.push_back(v[i].first);//     }//     return ret;//方法二:仿函数//仿函数// struct compare// {//     bool operator()(const pair<string ,int>&kv1,const pair<string ,int>&kv2)//     {//         return kv1.second>kv2.second||(kv1.second==kv2.second&&kv1.first<kv2.first);//     }// };// vector<string> topKFrequent(vector<string>& words, int k) // {//     map<string ,int>countMap;//     for(auto& str:words)//     {//         //统计次数//         countMap[str]++;//     }//     //数据量很大的时候要建小堆//     //数据量不大用大堆//     //但是这里要按频率所以不建议用小堆//     //用排序和大堆都差不多//     //不可以用sort直接去排序//     //sort要求是随机迭代器,只用string、vector、deque支持//     vector<pair<string,int>>v(countMap.begin(),countMap.end());//     //仿函数可以控制比较逻辑//     sort(v.begin(),v.end(),compare());//稳定的排序算法//     vector<string>ret;//     //取出k个//     for(int i=0;i<k;i++)//     {//         ret.push_back(v[i].first);//     }//     return ret;//方法三:优先级队列struct compare{bool operator()(const pair<string, int>& kv1, const pair<string, int>& kv2) const{// 比较逻辑:频率高优先,频率相同则字典序小优先return kv1.second < kv2.second ||(kv1.second == kv2.second && kv1.first > kv2.first);}};vector<string> topKFrequent(vector<string>& words, int k){map<string, int> countMap;for (auto& str : words){countMap[str]++;}//数据量很大的时候要建小堆//数据量不大用大堆//但是这里要按频率所以不建议用小堆//用排序和大堆都差不多//不可以用sort直接去排序//sort要求是随机迭代器,只用string、vector、deque支持//建立大堆//priority_queue默认为大堆//不写仿函数的时候priority_queue按pair比,pair默认按小于比priority_queue<pair<string, int>,           // - 元素类型: pair<string, int>vector<pair<string, int>>,  // - 容器类型: vector<pair<string, int>>compare>                   // - 比较器类型: compare (去掉括号)pq(countMap.begin(), countMap.end());vector<string> ret;for (int i = 0; i < k; i++){ret.push_back(pq.top().first);pq.pop();}return ret;}
};

        本期内容就到这里了,喜欢请点个赞谢谢。

封面图自取:

     

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

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

相关文章

[学习] CORDIC算法详解:从数学原理到反正切计算实战

CORDIC算法详解&#xff1a;从数学原理到反正切计算实战 文章目录CORDIC算法详解&#xff1a;从数学原理到反正切计算实战引言一、数学原理二、求解流程&#xff08;旋转模式&#xff09;三、典型应用场景四、反正切计算示例&#xff08;Python实现&#xff09;五、算法流程可视…

3款强力的Windows系统软件卸载工具

1、Geek 下载地址&#xff1a;https://download.csdn.net/download/weixin_42203093/91625765 Geek Uninstaller 是一款专业的 Windows 软件卸载工具&#xff0c;主要用于卸载软件并清理残留垃圾&#xff1a; 特点 体积小巧便携&#xff1a;软件体积约为 1.7M&#xff0c;是单…

AcWing 4579. 相遇问题

这道题做个今天的结尾 比较简单 正在备战csp吗&#xff0c;正好刷一下 难度&#xff1a;简单时/空限制&#xff1a;1s / 256MB总通过数&#xff1a;1738总尝试数&#xff1a;2584来源&#xff1a; CSP-J 2022 模拟赛 原题链接 4579. 相遇问题 - AcWing题库 题目描述 一…

基于clodop和Chrome原生打印的标签实现方法与性能对比

今天想看看&#xff0c;基于clodop和Chrome原生打印的标签实现方法与性能对比。先看看DeepSeek关于这个问题的回答&#xff01; CloudPrint 和 Chrome 原生打印的区别 基本概念差异 CloudPrint (Clodop) 是基于云的打印服务解决方案需要安装专门的客户端程序支持跨平台、跨设备…

百度网盘如何做到下载速度最快?OpenSpeedy绿色安装版下载,开源免费网盘加速

下载地址获取点击这里打开&#xff1a;OpenSpeedy下载地址 打开解压后的文件夹&#xff0c;找到【OpenSpeedy.exe】应用程序&#xff0c;右键选择【以管理员身份运行】。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 主要特性&#xff1a; 免费开源蛮…

科技云报到:热链路革命:阿卡 CRM 的 GTM 定位突围

科技云报道原创。在企业数字化的工具箱里&#xff0c;“CRM” 一词早已不是 “全流程客户管理” 的代名词&#xff0c;而是从营销获客到客户信息沉淀&#xff0c;再到长期关系维护&#xff0c;仿佛要包揽从线索到复购的所有环节。但成立仅两年半的阿卡 CRM&#xff0c;却在实践…

什么是Graphical Abstract

什么是Graphical Abstract 现在都需要用Graphical Abstract&#xff0c;新加的好像。图形摘要&#xff08;Graphical Abstract&#xff09;是学术论文中一种以可视化方式浓缩呈现研究核心内容的图表&#xff0c;它通过简洁的图形、流程图、示意图或组合视觉元素&#xff0c;直观…

心灵笔记:正念冥想

定义&#xff1a;正念冥想&#xff08;Mindfulness Meditation&#xff09;是一种源自东方禅修、结合现代心理学的心理训练方法&#xff0c;核心是有意识地将注意力集中在当下的体验上&#xff0c;不加评判地觉察自身的 thoughts&#xff08;想法&#xff09;、feelings&#x…

微软推出革命性AI安全工具Project IRE,重塑网络安全防御新范式

面对日益复杂的网络安全威胁&#xff0c;微软近日发布了具有里程碑意义的Project IRE AI工具。这项创新性解决方案将人工智能与逆向工程技术深度融合&#xff0c;开创了自动化威胁检测的新纪元。据微软官方披露&#xff0c;该工具能够在不依赖人工干预的情况下&#xff0c;自主…

C#Attribute(特性)的定义与使用

1.什么是 Attribute1.1 定义 Attribute 是一种“声明式元数据&#xff08;declarative metadata&#xff09;”机制。 • 附加位置&#xff1a;程序集、模块、类型、字段、属性、方法、方法参数、方法返回值、事件、泛型参数、局部变量、本地函数、Lambda 表达式、甚至表达式树…

飞书对接E签宝完整方案

1、概述飞书和E签宝在各自领域都属于领先的产品&#xff0c;但因为E签宝与钉钉的特殊关系&#xff0c;一直以来E签宝都只实现了与钉钉的深度集成&#xff0c;一家企业如果想同时使用飞书和E签宝&#xff0c;则需要通过S-HUB这样的产品来进行桥接&#xff0c;用户在飞书端审批&a…

Mysql快速导出数据库设计说明书word文档(表结构、类型、注释、是否有主键)

主要有三种方式&#xff0c;根据你的需求来选择&#xff1a; 1、Mysql语句查询 优点&#xff1a;无需安装额外的软件&#xff0c;使用你常用的数据库可视化工具即可 缺点&#xff1a;受限于你的数据库可视化工具的导出功能&#xff0c;需要额外写脚本进行处理 2、Python脚本…

DigitalProductId解密算法php调试版piddebug.php

<?php // 使用数组字面量 $digits [B, C, D, F, G, H, J, K, M, P, Q, R,T, V, W, X, Y, 2, 3, 4, 6, 7, 8, 9]; //foreach ($digits as $digit) { // echo $digit."<br>"; //}$hexPidarray(0xc2,0x49,0x4b,0xcc,0x60,0x34,0x09,0xcd,0x96,0xf7,0xec,0…

IDEA快捷键壁纸分享

说明&#xff08;1&#xff09;因为显示器的尺寸不同&#xff0c;对快捷键显示的位置稍作调整 &#xff08;2&#xff09;这里默认您熟悉常用的快捷键&#xff0c;分享一些功能好用但是用的少的快捷键空壁纸笔记本壁纸&#xff08;15.6寸&#xff09;24 寸显示器壁纸

InnoDB vs MyISAM: MySQL存储引擎的世纪对决

选错存储引擎&#xff1f;你的数据库性能可能暴跌80%&#xff01; 本文用最直观的对比拆解MySQL两大核心存储引擎的差异&#xff0c;让你彻底明白什么场景该选谁。一、引擎全景图: 数据库的"心脏"之争 ❤️ #mermaid-svg-KTQko8kEUvOkTb4L {font-family:"trebuc…

【Avalonia】无开发者账号使用iOS真机调试跨平台应用

文章目录1. 要求1.1 无需Apple开发者账号1.2 最新版mac系统1.3 最新版Xcode2. 配对Mac3. 配置开发证书3.1 创建一个名为MTClient的Xcode项目3.2 找到签名证书3.3 配置签名3.4 配置标识符4. 真机调试4.1 设置应用首屏 Launch Screen4.2 设置应用图标5. 问题5.1 DI异常该问题的解…

【LLM实战|langchain】langchain基础

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 【LLM实战|langchain】langchain基础 1. 模型 I/O 封装 把不同的模型&#xff0c;统一封装成一个接口&#xff0c;方便更换模型而不用重构代码。 1.1 …

十九、MySQL-DQL-基本查询

基本查询代码&#xff1a;DQL:基本查询 1.查询指定字段 name,entrydate 并返回 -- 1.查询指定字段 name,entrydate 并返回 select name,entrydate from tb_emp;2.查询返回所有字段 -- 2.查询返回所有字段 -- 推荐 select id, username, password, name, gender, image, job, e…

CamX-骁龙相机修改

1. 修改视频模式预览尺寸和分辨率 vendor/codeaurora/packages/apps/SnapdragonCamera/src/com/android/camera/CaptureModule.javaprivate void updatePreviewSize() {int width mPreviewSize.getWidth();int height mPreviewSize.getHeight(); - mPreviewSize new …

容器技术基础与实践:从镜像管理到自动运行配置全攻略

1. 相比较虚拟机&#xff0c;容器有哪些技术优势&#xff1f;&#xff08;1&#xff09;直接在操作系统上运行&#xff0c;从而跨系统上的所有容器共享资源&#xff0c;‘&#xff08;2&#xff09;共享主机的内核。&#xff08;3&#xff09;与虚拟机相比&#xff0c;它需要的…