【c++】set、map用法详解

set、map用法详解

  • 1. 关联式容器
  • 2. 键值对
    • 2.1 :pair
    • 2.2:make_pair
  • 3. 树形结构的关联式容器
    • 3.1:set
      • 构造函数
      • find()
      • erase()
      • insert()
      • count()
      • lower_bound()
      • upper_bound()
    • 3.2:multiset
    • 3.3:map
      • 构造函数
      • insert()
      • operator[]
    • 3.4:multimap
  • 4. 在Oj中的使用
    • 4.1:前K个高频单词
    • 4.2:两个数组的交集I

1. 关联式容器

  1. 序列式容器:vector、list、deque、forward_list等这些容器统称为序列式容器,底层是线性序列的数据结构,存储的是元素本身。插入方式一般为push。
  2. 关联式容器:set、map、multiset、multimap等这些容器统称为关联式容器,也是用来存储数据,但存储的是<key,value>结构的键值对,数据检索的效率比序列式容器高。插入方式一般为insert。

2. 键值对

2.1 :pair

概念:用来表示具有一一对应关系的一种结构,这种结构中一般存储两个成员变量key和value,key表示键值,value表示与key对应的信息。eg:英汉词典、单词的个数。

image.png

  • pair中的first为key,second为value。

2.2:make_pair

image.png
image.png

  • 概念:是一种可用来构造pair类型对象的函数模板。
  • 参数x用来初始化pair中第一个元素的值,参数y用来初始化pair中第二个元素的值。make_pair(x, y)返回值为pair<T1, T2>(x, y),为匿名对象。

3. 树形结构的关联式容器

  1. STL中总共有两种不同结构的管理式容器:树形结构和哈希结构。
  2. 树形结构的关联式容器主要有四种:set、multiset、map、multimap,共同特征:底层为平衡二叉树(红黑树),容器中的元素是有序序列。

3.1:set

image.png

  1. set是按特定顺序存储唯一元素的容器。使用迭代器遍历set中的元素,进行中序遍历,可以得到一个有序序列。
  2. set具有排序+去重的功能。set中元素必须不能重复,可以用set进行去重。set中元素类型为const T,所以set中的元素不能被修改,但可以在容器中插入或者删除他们。
  3. set中元素value就是key,所以set在插入元素时,只需要插入value即可,不需要构造键值对。与map、multimap不同,map、multimap中存储的是<key,value>键值对,set中只存储value,但在底层中实际存放的是由<value, value>构成的键值对。
  4. 在默认情况下,set中仿函数为less,元素是按照小于来比较,元素呈升序进行排序。set在底层使用平衡二叉搜索树(红黑树)来实现,所以set查找某个元素时,时间复杂度为O(logn)。
  5. set容器通过key访问单个元素的速度通常比unordered_set容器慢,允许根据顺序直接对子集进行迭代,即:因为set的有序性,当你迭代一个set时,会按照元素被添加到集合中的顺序看到它们。

构造函数

💡set s1;

  • 功能:无参构造。构造空的set。

💡set s2( InputIterator first, InputIterator last ) ;

  • 功能:迭代器区间构造。构造与[first, last)范围一样多元素的对象。

💡set s3(const set& s2) ;

  • 功能:拷贝构造函数。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{set<int> s1;  //无参构造//注意set:排序 + 去重int a[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int> s2(a, a + sizeof(a) / sizeof(int));  //迭代器区间构造set<int> s3(s2);  //拷贝构造auto it = s2.begin();while (it != s2.end()) //用迭代器进行遍历,中序遍历,升序序列{cout << *it << ' ';  //迭代器指向空间的值不能被修改,因为key为const Tit++;}cout << endl;for (auto& e : s3) //支持迭代器就支持范围for{cout << e << ' ';}cout << endl;return 0;
}

image.png

  • 迭代器指向空间的值不能被修改,因为set中key类型为const T。

find()

💡iterator find(const T& val)const ;

  • 功能:在set中查找是否存在值为val的元素,若查找到了,则返回该元素的迭代器,若查找不到了,则返回set: :end( )迭代器。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int, greater<int>> s1(a, a + sizeof(a) / sizeof(int)); //仿函数为greater,按大于进行比较auto it1 = s1.begin();while (it1 != s1.end()) //用迭代器进行遍历,中序遍历,仿函数为greater, 降序序列{cout << *it1 << ' ';  //迭代器指向的空间值不能被修改,因为key为const Tit1++;}cout << endl;set<int>::iterator it2 = s1.find(10);  //查找if (it2 != s1.end()){cout << "找到了" << endl;}else{cout << "找不到" << endl;}return 0;
}

image.png

erase()

💡void erase(iterator pos) ;

  • 功能:删除指定位置pos(迭代器)处的值。
  • 注意:删除某个值时,这个值必须存在,找到该值的有效位置,才能进行删除。若这个值不在,删除的是无效位置,则编译器会崩溃。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int, greater<int>> s1(a, a + sizeof(a) / sizeof(int)); auto it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << ' ';  it1++;}cout << endl;set<int>::iterator pos = s1.find(10); //s1.erase(pos); 错误,删除的值不存在,为无效位置,编译器会崩溃return 0;
}
  • image.png

💡size_t erase(const T& val) ;

  • 功能:删除值为val的元素,并返回删除元素的个数。
  • 注意:若val在,就进行删除,不在编译器不做任何处理。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int> s1(a, a + sizeof(a) / sizeof(int)); auto it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << ' ';  it1++;}cout << endl;s1.erase(10);  //10不在,编译器不做任何处理s1.erase(6);  for (auto& e : s1){cout << e << ' ';}cout << endl;return 0;
}

image.png

💡void erase ( iterator first, iterator last ) ;

  • 功能:删除[first , last)区间内的元素,剩余的元素仍有序。

insert()

💡pair<iterator,bool> insert(const T& val) ;

image.png

  • insert返回值为pair<iterator, bool>,若val在set中已经存在,因为set中不能出现重复元素,所以pair::first指向在set中与val值相等的迭代器,pair::second为false。若val在set中不存在,pair::first指向在set中新插入元素的迭代器,pair::second为true。insert相当于查找。set容器元素仍为有序序列。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int> s1(a, a + sizeof(a) / sizeof(int)); auto it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << ' ';  it1++;}cout << endl;pair<set<int>::iterator, bool> ret1 = s1.insert(10); cout << ret1.second << endl;pair<set<int>::iterator, bool> ret2 = s1.insert(6); cout << ret2.second << endl;for (auto& e : s1){cout << e << ' ';}cout << endl;return 0;
}

image.png

💡iterator insert(iterator pos , const T& val) ;

  • 功能:插入val。
  • insert返回值为iterator,因为set不允许出现重复元素,若val值不存在,则指向在set中新插入元素的迭代器,否则,返回在set中值与val相等元素的迭代器。
  • 此处不一定是在pos位置前插入val,因为set容器中的元素为有序序列且唯一,为了保证有序性和唯一性。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int> s1(a, a + sizeof(a) / sizeof(int)); auto it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << ' ';  it1++;}cout << endl;auto pos = s1.find(3);auto it2 = s1.insert(pos, 20);for (auto& e : s1){cout << e << ' ';}cout << endl;return 0;
}

image.png

💡void insert(iterator first , iterator last) ;

  • 功能:将区间[first, last)中的元素插入到set中。元素仍为唯一且有序。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a1[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int> s1(a1, a1 + sizeof(a1) / sizeof(int)); auto it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << ' ';  it1++;}cout << endl;int a2[] = { 10, 11, 10, 8, 6 };s1.insert(a2, a2 + sizeof(a2) / sizeof(int));for (auto& e : s1){cout << e << ' ';}cout << endl;return 0;
}

image.png

count()

💡size_t count( const T& val)const ;

  • 功能:返回值为val的元素个数。
  • 因为set中元素唯一,所以count的返回值不是0就是1,可以用来检查key是否在set中。

lower_bound()

💡iterator lower_bound(const T& val)cosnt;

  • 功能:返回>=val元素的迭代器。

upper_bound()

💡iterator upper_bound(const T& val)cosnt;

  • 功能:返回>val元素的迭代器。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a1[] = { 6, 3, 4, 2, 1, 6, 4, 5, 2}; set<int> s1(a1, a1 + sizeof(a1) / sizeof(int)); auto it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << ' ';  it1++;}cout << endl;auto it2 = s1.lower_bound(3); // >=3cout << *it2 << endl;auto it3 = s1.upper_bound(5); // >5cout << *it3 << endl;return 0;
}

image.png

3.2:multiset

image.png

  • multiset只具有 排序 功能。使用时与set包含的头文件相同#include。
  • multiset容器与set容器所提供的成员函数接口以及规定基本相同,两者唯一的区别是:set中key是唯一的,multiset中的key可以重复。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<set>using namespace std;int main()
{int a1[] = { 6, 3, 4, 2, 1, 6, 6, 4, 4, 5, 2}; multiset<int> s1(a1, a1 + sizeof(a1) / sizeof(int));  //只具有 排序 功能auto it1 = s1.begin();while (it1 != s1.end()) {cout << *it1 << ' ';  it1++;}cout << endl;auto start1 = s1.find(4);  //find返回二叉搜索树中序的第一个值为4元素的迭代器while (start1 != s1.end() && *start1 == 4){cout << *start1 << ' ';start1++;}cout << endl;auto start2 = s1.lower_bound(4); //lower_bound返回二叉搜索树中序>=4第一个元素的迭代器auto end2 = s1.upper_bound(5);  //upper_bound返回二叉搜索树中序>5第一个元素的迭代器while (start2 != end2){cout << *start2 << ' ';start2++;}cout << endl;return 0;
}

image.png

3.3:map

image.png

  • map是按特定顺序存储唯一元素的容器,元素是pair<const key, value>键值对,map中的key是唯一的,且不能被修改。使用迭代器遍历map中的元素,进行中序遍历,可以得到一个按照key排序的有序序列。
  • 在默认情况下,map中仿函数为less,元素是按照键值key进行小于方式的比较,元素中key呈升序进行排序。map在底层使用平衡搜索树(红黑树)来实现,所以map按照key值查找某个元素时,时间复杂度为O(logn)。
  • 模板参数中的Compare,缺省情况下按照小于进行比较,一般情况下,T为内置类型,该参数不需要传递,若T为自定义类型,需要用户自己手动传递比较规则,一般情况下是按照仿函数或者函数指针来传递。
  • map支持下标访问,在[ ]中放key,就可以找到与key相对应得value。operator[ ]操作符,具有插入、查找、修改、查找+修改功能。
  • map中通过键值key访问单个元素的速度比unordered_map容器慢,但map允许根据顺序直接对元素直接进行迭代,即:对map中的元素进行迭代时,可以得到一个有序序列。
  • map和set,一个是KV模型,一个是K模型,KV模型相比于K模型,只是在插入时多插入了value值,删除、查找都是对key进行操作,操作中的比较也是按key的值进行比较的。K模型类似于单身,KV模型类似于结婚。

构造函数

💡map<T1, T2> s1;

  • 功能:无参构造。构造空的map。

💡map<T1, T2> s2( InputIterator first, InputIterator last ) ;

  • 功能:迭代器区间构造。构造与[first, last)范围一样多元素的对象。

💡map<T1, T2> s3(const map<T1, T2>& s2) ;

  • 功能:拷贝构造函数。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>using namespace std;int main()
{map<string, string> m1; //无参构造pair<string, string> a[] = { {"sort", "排序"},{"left", "左"}, {"remove", "去除"}, {"right", "右"} };map<string, string> m2(a, a + sizeof(a)/sizeof(pair<string, string>));  //迭代器区间构造map<string, string> m3(m2);  //拷贝构造auto it1 = m2.begin();while (it1 != m2.end())  //用迭代器进行遍历,中序遍历,key呈升序序列{cout << (*it1).first << ":" << (*it1).second << endl;   //pair中的key不能被修改cout << it1->first << ":" << it1->second << endl;   it1++;}cout << endl;for (auto& e : m3)  //支持迭代器就支持范围for{cout << e.first << ":" << e.second << endl;}return 0;
}

image.png

insert()

💡pair<iterator,bool> insert(const value_type& val) ;

  • 功能:在map中插入一个键值对。

image.png

  • insert返回值为pair<iterator, bool>,若key在map中存在,因为map中不能出现重复的键值key,所以pair::first指向在map中与key值相等的迭代器,pair::second为false。若key在map中不存在,pair::first指向在map中新插入元素的迭代器,pair::second为true。insert相当于查找。map容器元素中键值key仍有序且唯一。
  • value_type为pair<const key, value>。需要先构造出pair类型对象,有以下三种方式,有名对象,匿名对象,多参数构造函数隐式类型转换(c++11支持)、make_pair(c++98支持)。
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>using namespace std;int main()
{map<string, string> m;//多参数构造函数支持隐式类型转换,中间会产生临时对象,临时对象具有常属性pair<string, string> p = { "appeal", "吸引" };m.insert(p);  //有名对象m.insert(pair<string, string>("give", "给予")); //匿名对象//c++11m.insert({ "big", "大的" });//c++98m.insert(make_pair("thing", "事情")); //make_pair构造pair类型对象for (auto& e : m){cout << e.first << ":" << e.second << endl;}return 0;
}

image.png

operator[]

💡T2& operatot[ ](const T1& key) ;

  • 功能:访问与key相对应的value值。即可读又可写。
  • 原理:operator[ ]底层是通过调用insert( )将键值队插入到map中。如果key存在,插入失败,insert返回与map中key值相同元素的迭代器。如果key不存在,插入成功,insert返回在map中新插入元素的迭代器。operator最后返回与key值相对应的value值的引用。
  • operator[ ] 具有插入、查找、插入+修改、查找+修改功能。

image.png

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>using namespace std;int main()
{map<string, string> m;m.insert(make_pair("thing", "事情")); m.insert(make_pair("sort", "排序"));for (auto& e : m){cout << e.first << ":" << e.second << endl;}cout << endl;m["right"] = "右";  //插入+修改m["sort"] = "xxx";  //查找+修改for (auto& e : m){cout << e.first << ":" << e.second << endl;}return 0;
}

image.png

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>using namespace std;int main()
{//统计水果的个数map<string, int> m1;string a[] = { "苹果", "香蕉", "梨子", "苹果", "苹果", "香蕉", "草莓" };for (auto& e : a) {auto it = m1.find(e);  //方法1if (it != m1.end())it->second++;elsem1.insert({ e, 1 });}for (auto& e : m1){cout << e.first << ":" << e.second << endl;}cout << endl;map<string, int> m2;for (auto& e : a) {m2[e]++;  //方法2}for (auto& e : m2){cout << e.first << ":" << e.second << endl;}return 0;
}

image.png

3.4:multimap

  • multimap容器与map容器所提供的成员函数接口以及规定基本相同,两者的区别是:map中key是唯一的,multimap中的key可以重复。map支持下标访问,multimap不支持下标访问,因为[ ]中存储的是key,而multimap中同一key,可能有多个value。
  • 在使用时与map包含的头文件相同#include
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<map>using namespace std;int main()
{pair<string, string> a1[] = { {"sort", "排序"}, {"left", "左"}, {"right", "右"},{"sort", "xxx"} ,{"left", "???"} };multimap<string, string> m1(a1, a1 + sizeof(a1) / sizeof(pair<string, string>));  auto it1 = m1.begin();while (it1 != m1.end()){cout << it1->first << ' ' << it1->second << endl; it1++;}cout << endl;auto start1 = m1.find("sort");  //find返回二叉搜索树中序的第一个key为sort元素的迭代器while (start1 != m1.end()){cout << start1->first << ' ' << start1->second << endl;start1++;}cout << endl;auto start2 = m1.lower_bound("left"); //lower_bound返回二叉搜索树中序>key为left第一个元素的迭代器auto end2 = m1.upper_bound("right");  //upper_bound返回二叉搜索树中序>key为right第一个元素的迭代器while (start2 != end2){cout << start2->first << ' ' << start2->second << endl;start2++;}cout << endl;return 0;
}

image.png

4. 在Oj中的使用

4.1:前K个高频单词

https://leetcode.cn/problems/top-k-frequent-words/description/

class Solution {
public:template<class T>class KvCompare{public:bool operator()(const T& p1, const T& p2){return p1.second > p2.second || (p1.second == p2.second && p1.first < p2.first);}};vector<string> topKFrequent(vector<string>& words, int k) {map<string, int> m; for(auto& e : words)m[e]++;  //使用map来统计单词的个数priority_queue<pair<string, int>, KvCompare<pair<string, int>>> pq(m.begin(), m.end());vector<string> ret;while(k--){ret.push_back(pq.top());pq.pop();}return ret;}
};

4.2:两个数组的交集I

https://leetcode.cn/problems/intersection-of-two-arrays/description/

/*方法1:nums1、nums2都用set进行排序+去重,在遍历s2, 判断是否s1.count(e)==1;
方法2:sort+unique+erase,nums2[5]={1,1,2,2,3}->nums2{1,2,3,1,2},unique返回值为nums2+3;
方法3:set+数据同步、备份算法,前提都是有序+去重,同时从头开始往后走,值小的++,值相同,同时++,直到有一个走到了尾就停止*/
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());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;}
};

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

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

相关文章

【数据结构】浅谈

✨✨✨专栏&#xff1a;数据结构 &#x1f9d1;‍&#x1f393;个人主页&#xff1a;SWsunlight 目录 一、概念&#xff1a; 二、物理结构&#xff1a; 1、顺序存储结构&#xff1a; 2、链式存储结构&#xff1a; 3、数据索引存储结构: 4、数据散列存储结构&#xf…

现代制造之Cura切片

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

手把手教你用 spacy3 训练中文NER

文章目录 模型文件下载训练模型准备数据转化成 doc_bin 格式模型训练配置生成初始配置补全完整配置 开始训练 测试模型参考文献 模型文件下载 https://github.com/explosion/spacy-models/releases?qzh&expandedtrue 简单测试一下ner效果&#xff0c;发现根本不能用 训…

关于‘==’与equals的区别

我写的也不清楚&#xff0c;有兴趣的可以看这位大佬的文章链接&#xff0c;说的很清楚 https://www.cnblogs.com/Latiny/p/8099581.html#!comments 与 equals 方法 判断两个变量是否相等有两种方式&#xff1a;一种是利用 运算符&#xff0c;另一种是利用equals方法。 注意…

C#语音播报(通过CoreAudioAPI完成对扬声器的控制)

1&#xff0c;效果&#xff1a; 作用&#xff1a; 可对当前内容&#xff08;例如此例中的重量信息&#xff09;进行语音合成播报 。可设置系统扬声器音量与状态(是否静音),同时根据扬声器状态同步更新当前控件状态与值&#xff0c;实现强制PC扬声器按照指定的音量进行播报&…

MATLAB的Bar3函数调节渐变色(内附渐变色库.mat及.m文件免费下载链接)

一. colormap函数 可以使用colormap函数&#xff1a; t1[281.1,584.6, 884.3,1182.9,1485.2; 291.6,592.6,896,1197.75,1497.33; 293.8,596.4,898.6,1204.4,1506.4; 295.8,598,904.4,1209.0,1514.6];bar3(t1,1) set(gca,XTickLabel,{300,600,900,1200,1500},FontSize,10) set…

智慧园区能耗管控系统,3D可视化开发都需要哪些技术栈?

数据可视化&#xff1a; 数据可视化是将数据通过图表、图形、地图等可视化方式展示&#xff0c;使得数据更加直观、易于理解和分析。在智慧园区能耗管控系统中&#xff0c;可以使用各种图表库&#xff08;如Echarts、Highcharts&#xff09;和可视化工具&#xff08;如Tableau…

MES系统与WMS集成方法(满分100学习资料)

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载 这份文件是关于MES系…

常见排序算法——希尔排序

基本原理 希尔排序在插入排序的基础之上&#xff0c;将待排序序列分成组&#xff0c;分成 gap 个组&#xff0c;组的数量通过 length / 2 获得&#xff0c;比如6个元素的序列&#xff0c;那么就是 3 个组&#xff0c;每个组两个元素&#xff0c;然后将每个组的元素进行插入排…

ECharts系列:基本使用及配置项

目录 基本使用 配置项的写法与位置 配置项option包含属性 各个配置项属性大全 基本使用 在阅读本篇文章时请参考ECharts官网地址中的内容配合了解 首先我们知道ECharts图表中有许多类型&#xff0c;如折线图、柱状图、饼形图等&#xff0c;下面我以折线图为例讲解ECharts图…

文本检测模型 DBNet 一种基于分割算法的模型 对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合 可微分二值化模块 概率图

文本检测模型 DBNet DBNet文本检测模型是一种基于分割算法的模型,其优化之处在于对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合。 传统的文本检测方法通常将二值化作为一个后处理步骤,与网络训练分开进行。而DBNet则提出了一种可微分的二值化方法,即将文…

【全开源】Java同城预约月嫂服务上门服务本地服务源码APP+小程序+公众号+H5

特色功能&#xff1a; 预约服务&#xff1a;用户可以通过小程序在线预约月嫂服务&#xff0c;选择服务时间、服务类型、月嫂等信息&#xff0c;实现方便快捷的预约流程。在线咨询&#xff1a;用户可以通过小程序向月嫂或服务机构咨询相关问题&#xff0c;获得专业的解答和建议…

Linux修炼之路之基础指令(2)+shell命令及运行原理

目录 一&#xff1a;基础指令 7.rm指令 和 rmdir指令 8.*通配符 9.man指令 10.echo指令 11.cat 指令 12.cp 指令 13.mv指令 14.alias 指令 15.less more head tail wc-l 指令 16.date 时间相关的指令 17.cal指令 18. find which whereis 三个查找文件指令…

【全开源】Java俱乐部系统社区论坛商城系统源码-奔驰奥迪保时捷大众宝马等汽车俱乐部

特色功能&#xff1a; 会员中心&#xff1a;会员中心可以帮助企业更好地管理客户&#xff0c;包括设置积分商城、会员卡充值、个人汽车档案等功能&#xff0c;对不同的会员群体展开有针对性的营销&#xff0c;并维护和积累自己的粉丝群体。信息服务&#xff1a;负责定期发布新…

关于在ubuntu18.04中运行ORB_SLAM3时遇到的报错:段错误(核心已转储)的解决方法(踩坑记录)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、段错误&#xff08;核心已转储&#xff09;1. 已放弃(核心已转储)(1) 问题描述(2)原因分析 二、解决方法1. 解决方法一2. 解决方法二 总结 一、段错误&#xff…

【硬件模块】ESP-01SWiFi模块基于AT指令详解(WiFi,TCP/IP,MQTT)

ESP-01S ESP-01S是由安信可科技开发的一款Wi-Fi模块。其核心处理器是ESP8266&#xff0c;该处理器在较小尺寸的封装中集成了业界领先的Tensilica L106超低功耗32位微型MCU&#xff0c;带有16位精简模式&#xff0c;主频支持80MHz和160MHz&#xff0c;并集成了Wi-Fi MAC/BB/RF/P…

Django性能之道:缓存应用与优化实战

title: Django性能之道&#xff1a;缓存应用与优化实战 date: 2024/5/11 18:34:22 updated: 2024/5/11 18:34:22 categories: 后端开发 tags: 缓存系统Redis优点Memcached优缺点Django缓存数据库优化性能监控安全实践 引言 在当今的互联网时代&#xff0c;用户对网站和应用…

一个优秀 Maven 项目,各 Model 间最佳继承设计方案

1.单一职责原则 (Single Responsibility Principle): 每个模块应该专注于执行一个清晰且明确定义的功能&#xff0c;遵循单一职责原则&#xff0c;以降低模块的复杂性。 2.高内聚性 (High Cohesion): 模块内的组件和类应该紧密相关&#xff0c;共同实现模块的目标。高内聚性…

macOS DOSBox 汇编环境搭建

正文 一、安装DOSBox 首先前往DOSBox的官网下载并安装最新版本的DOSBox。 二、下载必备的工具包 在用户目录下新建一个文件夹&#xff0c;比如 dosbox: mkdir dosbox然后下载一些常用的工具。下载好了后&#xff0c;将这些工具解压&#xff0c;重新放在 dosbox 这个文件夹…

【基础绘图】 09.小提琴图

效果图&#xff1a; 主要步骤&#xff1a; 1. 数据准备&#xff1a;生成随机数组 2. 数据处理&#xff1a;计算四分位数、中位数、均值、最大最小值 3. 图像绘制&#xff1a;绘制小提琴图 详细代码&#xff1a;着急的直接拖到最后有完整代码 步骤一&#xff1a;导入库包及…