【STL巨头】set、map、multiset、multimap的介绍及使用

set、map、multiset、multimap的介绍及使用

  • 一、关联式容器
  • 二、键值对
    • 键值对概念
    • 定义
  • 三、set
    • set的介绍
    • set的使用
      • set的模板参数列表
      • set的构造
      • set的迭代器
      • set的容量
        • empty
        • size
      • set的修改操作
        • insert
        • find && erase
        • count
        • lower_bound 和 upper_bound
    • Multiset的用法
  • 四、map
    • map的介绍
    • map的用法
      • map的模板参数
    • map迭代器
    • map的构造
    • map的常见修改操作
      • insert
      • erase
      • find
      • count
    • map的容量与元素访问 -- operator[]
    • 利用map统计出现次数
      • 用直接插入法
      • 用[]法
    • multimap
      • multimap介绍
      • multimap的使用
  • 五、题目
    • 前k个高频词
      • 题目描述
      • 解题思路
      • 解题代码
    • 两个数组的交集
      • 题目描述
      • 解题思路
      • 解题代码
      • 差集思想


一、关联式容器

初期,我们接触了list,vector,deque等容器,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。
关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。

在这里插入图片描述

二、键值对

键值对概念

用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

定义

SGI-STL中关于键值对pair的定义:

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){}
};

三、set

set的介绍

  1. set是按照一定次序存储元素的容器
  2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
  3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
  4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
  5. set在底层是用二叉搜索树(红黑树)实现的。

1.与map/multimap不同,map/multimap中存储的是真正的键值对<key,value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
2. set中插入元素时,只需要插入value即可,不需要构造键值对。
3. set中的元素不可以重复(因此可以使用set进行去重)。
4. 使用set的迭代器遍历set中的元素,可以得到有序序列
5. set中的元素默认按照小于来比较
6. set中查找某个元素,时间复杂度为: l o g 2 n log_2 n log2n
7. set中的元素不允许修改(为什么?)
8. set中的底层使用二叉搜索树(红黑树)来实现。

总结:set的本质就是key模型。

set的使用

set支持的操作为增删查,不能修改!

set的模板参数列表

在这里插入图片描述
T:set中存放元素的类型,实际在底层存储的是<value, value>的键值对
Compare:仿函数,set容器中默认使用库函数中的less函数来比较,我们如果想实现More函数我们可以自己进行写一个More函数以实现不同的功能。
Alloc:set中元素空间的管理方式,使用STL提供的空间配置器。

set的构造

在这里插入图片描述

void testset1()
{set<int> set1;int num[10] = { 1,2,4,3,5,7,6,8,9,10 };// 区间构造set<int> set2(num, num + sizeof(num) / sizeof(num[0]));// 拷贝构造set<int> set3(set2);// 拷贝构造代价太大// for循环打印set2for (auto& e : set2){cout << e << " ";}cout << endl;// for循环打印set3for (auto& e : set3){cout << e << " ";}cout << endl;
}

在这里插入图片描述

set的迭代器

在这里插入图片描述

如图所示:

在这里插入图片描述

void testset2()
{set<int> set1 = { 1,2,1,4,5,3,7,6,5,8,9 };set<int>::iterator it = set1.begin();// 去重+排序while (it != set1.end()){cout << *it << " ";++it;}cout << endl;// 范围forfor (auto& e : set1){cout << e << " ";}cout << endl;
}

在这里插入图片描述

我们如果想要将这个排序变成降序该咋办呢?很简单,用一个Greater仿函数即可:

void testset3()
{int a[10] = { 1,3,1,2,4,5,7,6,5,8 };// 这个greater仿函数是set库函数中的函数// 就是进行降序的函数set<int, greater<int>> set1(a, a + sizeof(a) / sizeof(a[0]));// for循环for (auto& e : set1){cout << e << " ";}cout << endl;
}

在这里插入图片描述

set的容量

empty

在这里插入图片描述

size

在这里插入图片描述

set的修改操作

insert

在这里插入图片描述
这里我们直接用cplusplus网站上的插入介绍和代码解析:

在这里插入图片描述

void testset4()
{std::set<int> myset;std::set<int>::iterator it;std::pair<std::set<int>::iterator, bool> ret;// for循环并单个插入for (int i = 1; i <= 5; ++i)myset.insert(i * 10);// 单个插入ret = myset.insert(20);if (ret.second == false) it = ret.first;// 插入迭代器所代表的值myset.insert(it, 25);myset.insert(it, 24);myset.insert(it, 26);// 插入一段区间int myints[] = { 5,10,15 };myset.insert(myints, myints + 3);std::cout << "myset contains:";for (it = myset.begin(); it != myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';
}
find && erase

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

void testset5()
{std::set<int> myset;std::set<int>::iterator it;for (int i = 1; i < 10; i++) myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90it = myset.begin();++it; // 第二个位置// 删除第二个位置myset.erase(it);// 删除一个数myset.erase(40);// 删除一个迭代器区间it = myset.find(60);myset.erase(it, myset.end());std::cout << "myset contains:";for (it = myset.begin(); it != myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';
}

在这里插入图片描述

上面是erase,我们下面介绍一下find:
在这里插入图片描述
在这里插入图片描述

void testset6()
{std::set<int> myset;std::set<int>::iterator it;for (int i = 1; i <= 5; i++) myset.insert(i * 10); // 10 20 30 40 50it = myset.find(20);myset.erase(it); // 删除20这个迭代器的值myset.erase(myset.find(40)); // 删除40这个迭代器的值std::cout << "myset contains:";for (it = myset.begin(); it != myset.end(); ++it)std::cout << ' ' << *it;std::cout << '\n';
}

在这里插入图片描述

看似没什么问题,有一个问题,那我们假如说删除了一个并不存在的数值或者是迭代器呢?
在这里插入图片描述
所以我们在写完find以后需要判断一下是否是真的找到了,找到了才能删除,找不到就不删除即可。

	// 删除一个不存在的迭代器set<int>::iterator pos = myset.find(70);if (pos != myset.end()){myset.erase(pos);}
count

在这里插入图片描述

在这里插入图片描述

lower_bound 和 upper_bound

在这里插入图片描述

void testset9()
{set<int> myset;set<int>::iterator itup, itlow;for (int i = 1; i < 10; ++i){myset.insert(i * 10);}itlow = myset.lower_bound(35);itup = myset.upper_bound(60);cout << "[" << *itlow << "," << *itup << "]" << endl;myset.erase(itlow, itup);for (auto& e : myset){cout << e << " ";}cout << endl;
}

在这里插入图片描述

Multiset的用法

multiset的用法和set基本是一致的,唯一一个区别是multiset允许键值对冗余,即使用multiset可以让数字重复。

void testset10()
{// multisetint a[10] = {1,3,2,4,1,2,5,6,7,10};multiset<int> set1(a, a + sizeof(a) / sizeof(a[0]));for (auto& e : set1){cout << e << " ";}cout << endl;
}

在这里插入图片描述

还有一个find和erase呢?
find是返回中序中的第一个(在有多个重复值的情况下)。
在这里插入图片描述

erase是将所有的想删除的值全部删掉。

四、map

map的介绍

  1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素
  2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair: typedef pair<const key, T> value_type;
  3. 在内部,map中的元素总是按照键值key进行比较排序的
  4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。
  5. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
  6. map通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。

map的用法

map的模板参数

在这里插入图片描述

key: 键值对中key的类型
T: 键值对中value的类型
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的空间配置器

map迭代器

在这里插入图片描述

void testmap1()
{map<string, string> map1;map1.insert(make_pair("banana", "香蕉"));map1.insert(make_pair("apple", "苹果"));map1.insert(make_pair("orange", "橙子"));map<string, string>::iterator it = map1.begin();while (it != map1.end()){cout << it->first << it->second << endl;++it;}
}

在这里插入图片描述

map的构造

在这里插入图片描述

void testmap2()
{map<int, int> map1; // 空的构造int a[] = { 1,2,3,4,5,6,7,8,88,9,10 };for (auto& e : a){map1.insert(make_pair(e, e));}map<int, int> map2(map1.begin(), map1.end()); // 迭代器区间构造map<int, int> map3(map2); // 拷贝构造for (auto& e : map3){cout << e.first << "->" << e.second << endl;}
}

在这里插入图片描述

map的常见修改操作

insert

在这里插入图片描述

void testmap3()
{std::map<char, int> mymap;// 匿名对象mymap.insert(std::pair<char, int>('a', 100));mymap.insert(std::pair<char, int>('z', 200));// 在map中插入一个键值对,迭代器加判断是否插入成功std::pair<std::map<char, int>::iterator, bool> ret;ret = mymap.insert(std::pair<char, int>('z', 500));if (ret.second == false) {std::cout << "element 'z' already existed";std::cout << " with a value of " << ret.first->second << '\n';}// 插入一个迭代器位置加值std::map<char, int>::iterator it = mymap.begin();mymap.insert(it, std::pair<char, int>('b', 300));mymap.insert(it, std::pair<char, int>('c', 400));// 迭代器区间插入,利用begin()到find('c')的位置std::map<char, int> anothermap;anothermap.insert(mymap.begin(), mymap.find('c'));std::cout << "mymap contains:\n";for (it = mymap.begin(); it != mymap.end(); ++it)std::cout << it->first << " => " << it->second << '\n';std::cout << "anothermap contains:\n";for (it = anothermap.begin(); it != anothermap.end(); ++it)std::cout << it->first << " => " << it->second << '\n';
}

还有一种很省力的方法,使用make_pair(匿名对象),因为是make_pair返回的就是pair<T1,T2>(x, y),即自动识别类型。
在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{std::map<int, int> map1;map1.insert(make_pair(1, 1));map1.insert(make_pair(2, 2));map1.insert(make_pair(3, 3));for(auto& e : map1){cout << e << " ";}cout << endl;
}

erase

在这里插入图片描述

void testmap4()
{std::map<char, int> mymap;std::map<char, int>::iterator it;mymap.insert(make_pair('a', 10));mymap.insert(make_pair('b', 20));mymap.insert(make_pair('c', 30));mymap.insert(make_pair('d', 40));mymap.insert(make_pair('e', 50));mymap.insert(make_pair('f', 60));// 删除b这个位置的整个迭代器it = mymap.find('b');mymap.erase(it);// 删除键值为c的元素mymap.erase('c');// 删除迭代器区间it = mymap.find('e');mymap.erase(it, mymap.end());for (it = mymap.begin(); it != mymap.end(); ++it)std::cout << it->first << " => " << it->second << '\n';
}

find

在这里插入图片描述

void testmap5()
{std::map<char, int> mymap;std::map<char, int>::iterator it;mymap.insert(pair<char, int>('a', 50));mymap.insert(make_pair('b', 100));mymap.insert(pair<char, int>('c', 150));mymap.insert(pair<char, int>('d', 200));// 找到b这个键值对it = mymap.find('b');if (it != mymap.end()) // 判断是否找到mymap.erase(it);std::cout << "elements in mymap:" << '\n';std::cout << "a => " << mymap.find('a')->second << '\n';std::cout << "c => " << mymap.find('c')->second << '\n';std::cout << "d => " << mymap.find('d')->second << '\n';
}

count

void testmap6()
{std::map<char, int> mymap;char c;mymap.insert(make_pair('a', 101));mymap.insert(make_pair('b', 202));mymap.insert(make_pair('c', 303));mymap.insert(make_pair('d', 404));for (c = 'a'; c < 'h'; c++){std::cout << c;if (mymap.count(c) > 0) // 数值大于0则输出是个有值的mapstd::cout << " is an element of mymap.\n";elsestd::cout << " is not an element of mymap.\n";}
}

在这里插入图片描述

map的容量与元素访问 – operator[]

在这里插入图片描述

empty和size都好讲,一个是判空,一个是算里面的数量,而重头戏在operator[]。

在这里插入图片描述

[]:有插入、查找和修改的功能。
1、map中有这个key,返回value的引用。
2、map中没有这个key的匹配值,则先构造一个pair(key, T()),先插入这个key值,再将value进行默认构造,最后返回value的引用。‘

在这里插入图片描述

[]的底层实现:

在这里插入图片描述

底层实现有两个pair的方式:
第一个是像上面所述的当key在map中的时候,返回的pair(key_iterator, false),当key不在map中,返回的是pair(new_key_iterator, true),即返回的是迭代器和bool值。
第二种则是kv模型的pair,是插入的pair的数据。

V& operator[](const K& key)
{pair<iterator, bool> ret = insert(make_pair(key, V());return ret.first->second;
}

利用map统计出现次数

用直接插入法

void test_map()
{string arr[] = { "苹果","香蕉","橙子","苹果","香蕉","橙子","苹果","香蕉","橙子","梨","柠檬" };map<string, int> fruitcount;for (auto& e : arr){map<string, int>::iterator it = fruitcount.find(e);if (it != fruitcount.end()){it->second++;}else{// 刚进入fruitcount.insert(make_pair(e, 1));}}// 遍历map<string, int>::iterator it = fruitcount.begin();while (it != fruitcount.end()){cout << it->first << "=>" << it->second << endl;++it;}cout << endl;
}

用[]法

void test_map1()
{string arr[] = { "苹果","香蕉","橙子","苹果","香蕉","橙子","苹果","香蕉","橙子","梨","柠檬" };map<string, int> fruitcount;for (auto& e : arr){//1、e不在fruitcount中,插入pair(e, int()),然后对返回次数++//2、e在的话,就返回value的引用次数++fruitcount[e]++;}// 遍历map<string, int>::iterator it = fruitcount.begin();while (it != fruitcount.end()){cout << it->first << "=>" << it->second << endl;++it;}cout << endl;
}

multimap

multimap介绍

  1. Multimaps是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key, value>,其中多个键值对之间的key是可以重复的
  2. 在multimap中,通常按照key排序和惟一地标识元素,而映射的value存储与key关联的内容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组合key和value的键值对:typedef pair<const Key, T> value_type;
  3. 在内部,multimap中的元素总是通过其内部比较对象,按照指定的特定严格弱排序标准对key进行排序的
  4. multimap通过key访问单个元素的速度通常比unordered_multimap容器,但是使用迭代器直接遍历multimap中的元素可以得到关于key有序的序列。
  5. multimap在底层用二叉搜索树(红黑树)来实现

multimap的使用

void test_map2()
{multimap<string, string> mdict;mdict.insert(make_pair("sort", "排序"));mdict.insert(make_pair("left", "左边"));mdict.insert(make_pair("left", "右边"));mdict.insert(make_pair("left", "不知道"));// 遍历for (auto& e : mdict){cout << e.first << "=>" << e.second << endl;}cout << endl;
}

在这里插入图片描述

五、题目

前k个高频词

题目描述

在这里插入图片描述

解题思路

在这里插入图片描述

解题代码

class Solution {
public:vector<string> topKFrequent(vector<string>& words, int k) {// 用来记录次序的,本身就是按照字典序进行统计次数的map<std::string, int> countmap;for(const auto& e : words){countmap[e]++;}// 用来排序的multimap<int, string, greater<int>> sortmap;// i - 2 love - 2 leetcode - 1 coding - 1for(auto& e : countmap){sortmap.insert(make_pair(e.second, e.first));}// 开辟一个字符串数组vector<string> v;multimap<int, string, greater<int>>::iterator it = sortmap.begin();for(int i = 0; i < k; i++){v.push_back(it->second);++it;}return v;}
};

两个数组的交集

题目描述

在这里插入图片描述

解题思路

在这里插入图片描述

解题代码

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {set<int> s1(nums1.begin(), nums1.end());set<int> s2(nums2.begin(), nums2.end());set<int>::iterator it1 = s1.begin();set<int>::iterator it2 = s2.begin();vector<int> v;while(it1 != s1.end() && it2 != s2.end()){if(*it1 < *it2){++it1;}else if(*it1 > *it2){++it2;}else{v.push_back(*it1);++it2;++it1;}}return v;}
};

差集思想

在这里插入图片描述

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

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

相关文章

inndy_echo

inndy_echo Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;只开了NX int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {char s; // [espCh…

Unity2023打包首包从78Mb到3.0Mb-震惊-我做对了什么

&#xff08;全程并没有使用AssetBundle , 历史原因&#xff0c;Resources目录还有不少资源残留&#xff09; 曾经的我在2019打包过最小包10m左右&#xff0c;后来发现到了Unity2020之后暴增到40m&#xff0c;又加上2023版本URP&#xff0c;1个Unity输出包可能至少55M 如下图…

华为智能高校出口安全解决方案(3)

本文承接&#xff1a; https://qiuhualin.blog.csdn.net/article/details/133267254?spm1001.2014.3001.5502 重点讲解华为智能高校出口安全解决方案的攻击防御&安全运维&日志审计的部署流程。 华为智能高校出口安全解决方案&#xff08;3&#xff09; 课程地址攻击防…

基于Vue+ELement实现增删改查案例与表单验证(附源码)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

孤举者难起,众行者易趋,openGauss 5.1.0版本正式发布!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

Java获取给定月份的前N个月份和前N个季度

描述&#xff1a; 在项目开发过程中&#xff0c;遇到这样一个需求&#xff0c;即&#xff1a;给定某一月份&#xff0c;得到该月份前面的几个月份以及前面的几个季度。例如&#xff1a;给定2023-09&#xff0c;获取该月份前面的前3个月&#xff0c;即2023-08、2023-07、2023-0…

基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

IDEA 使用

目录 Git.gitignore 不上传取消idea自动 add file to git本地已经有一个开发完成的项目&#xff0c;这个时候想要上传到仓库中 Git .gitignore 不上传 在项目根目录下创建 .gitignore 文件夹&#xff0c;并添加内容&#xff1a; .gitignore取消idea自动 add file to git 在…

layuiselect设置为不可下拉选取

$("#exam").siblings(".layui-form-select").find("dl").remove(); 或 layuiSelectDisable($("#exam")); // 设置selet元素不可下拉选择function layuiSelectDisable(selectElem) {try {var dlElem selectElem.siblings(".layu…

通俗讲解深度学习轻量网络MobileNet-v1/v2/v3

MobileNet网络是由google团队在2017年提出的&#xff0c;专注于移动端或者嵌入式设备中的轻量级CNN网络。相比传统卷积神经网络&#xff0c;在准确率小幅降低的前提下大大减少模型参数与运算量。(相比VGG16准确率减少了0.9%&#xff0c;但模型参数只有VGG的1/32)。MobileNet网络…

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元时间序…

Spring Boot 技术架构图(InsCode AI 创作助手辅助)

Spring Boot 技术架构是一种用于构建现代应用程序的框架&#xff0c;它可以与各种前端、代理、网关、业务服务、中间件、存储、持续集成和容器服务集成在一起&#xff0c;以创建功能强大的应用程序。 源文件下载链接&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

CMD命令终端快捷键学习

很多环境需要安装并且指定环境变量才可用终端访问 比如一些数据库、一些环境、例如&#xff1a;nodejs Oracle、mysql 在一个文件夹按住shift鼠标右键可以快速在当前目录运行终端&#xff01;免去cd 目录的烦恼 快捷键 当你学习和使用命令终端&#xff08;如 Windows 的 CMD&…

opencv图像数组坐标系

在OpenCV的Python接口&#xff08;cv2&#xff09;中&#xff0c;加载的图像数组遵循以下坐标系和方向约定&#xff1a; 1. **坐标系&#xff1a;** OpenCV的坐标系遵循数学中的坐标系&#xff0c;原点&#xff08;0, 0&#xff09;位于图像的左上角。横轴&#xff08;X轴&…

抖音开放平台第三方代小程序开发,一整套流程

大家好&#xff0c;我是小悟 抖音小程序第三方平台开发着力于解决抖音生态体系内的小程序管理问题&#xff0c;一套模板&#xff0c;随处部署。能尽可能地减少服务商的开发成本&#xff0c;服务商只用开发一套小程序代码作为模板就可以快速批量的孵化出大量的商家小程序。 第…

CentOS 7 安装 Docker 的详细步骤

文章目录 Docker简介1.更新2.安装必要的软件包3.添加Docker仓库4.安装5.安装后的一些常规设置及常用的命令5.1 启动 Docker5.2 Docker 在系统启动时自动运行5.3 运行一个 Hello World 镜像5.4 查看docker运行状态5.5 docker ps5.6 查看docker版本 6.安装种常见的错误错误1:yum-…

【CMU15-445 Part-14】Query Planning Optimization I

Part14-Query Planning & Optimization I SQL is Declarative&#xff0c;只告诉想要什么而不需要说怎么做。 IBM System R是第一个实现query optimizer查询优化器的系统 Heuristics / Rules 条件触发 静态规则&#xff0c;重写query来remove 低效或者愚蠢的东西&#xf…

Ubuntu性能分析-ftrace 底层驱动

1、框架介绍 ftrace内核驱动可以分为几部分:ftrace framework,RingBuffer,debugfs,Tracepoint,各种Tracer。 ftrace框架是整个ftrace功能的纽带,包括对内和的修改,Tracer的注册,RingBuffer的控制等等。 RingBuffer是静态动态ftrace的载体。 debugfs则提供了用户空间…

华为智能企业上网行为管理安全解决方案(1)

华为智能企业上网行为管理安全解决方案&#xff08;1&#xff09; 课程地址方案背景需求分析企业上网行为概述企业上网行为安全风险分析企业上网行为管理需求分析 方案设计组网架构设备选型设备简介行为管理要点分析方案功能概述 课程地址 本方案相关课程资源已在华为O3社区发…

【目标检测】——Gold-YOLO为啥能超过YOLOV8

华为 https://arxiv.org/pdf/2309.11331.pdf 文章的出发点&#xff1a;FPN中的信息传输问题 1. 简介 基于全局信息融合的概念&#xff0c;提出了一种新的收集和分发机制&#xff08;GD&#xff09;&#xff0c;用于在YOLO中进行有效的信息交换。通过全局融合多层特征并将全局信…