【C++】set、multiset與map、multimap的使用

目錄

  • 一、關聯式容器
  • 二、鍵值對
  • 三、樹形結構的關聯式容器
    • 3.1 set
      • 3.1.1 模板參數列表
      • 3.1.2 構造
      • 3.1.3 迭代器
      • 3.1.4 容量
      • 3.1.5 修改操作
    • 3.2 multiset
    • 3.3 map
      • 3.3.1 模板參數列表
      • 3.3.2 構造
      • 3.3.3 迭代器
      • 3.3.4 容量
      • 3.3.5 修改操作
      • 3.3.6 operator[]
    • 3.4 multimap

一、關聯式容器

談到關聯式容器,先來說說序列式容器,以前學習的vector、list、deque等就是序列式容器,它們的特點是底層為線性序列的數據結構,存儲的是元素本身。關聯式容器也是存儲數據的,不同的是,里面存儲的是<key, value>結構的鍵值對,在數據檢索時比序列式容器效率更高。

二、鍵值對

鍵值對是用來表示一一對應關系的結構該結構中一般只包含兩個成員變量key和value,key代表鍵值,value表示與key對應的信息,比如漢英互譯字典,查中文就可以找到對應的英文,是有對應關系的。

鍵值對的定義:

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

三、樹形結構的關聯式容器

STL總共有兩種結構的關聯式容器,分別是哈希結構和樹形結構。樹形結構主要有4種:set、multiset、map、multimap,它們的共同點是底層是平衡搜索樹即紅黑樹實現的,且容器中的元素是一個有序的序列。

3.1 set

特點:

  1. 遍歷set中的元素,可以得到一個有序序列,因為它的底層實現是紅黑樹,再底層是二叉搜索樹,遍歷方式是中序遍歷。
  2. set中的元素不可以重復,因此可以用set去重。
  3. 與map/multimap不同,map/multimap中存儲的是真正的鍵值對<key, value>,set中只放value,但在底層實際存放的是由<value, value>構成的鍵值對。
  4. set中插入元素時,只需要插入value即可,不需要構造鍵值對。
  5. set中的元素默認按照小于來比較。
  6. set中查找某個元素,時間復雜度為:logN,即最多高度次。
  7. 在內部,set中的元素總是按照其內部比較對象(類型比較)所指示的特定嚴格弱排序準則進行排序。
  8. set容器通過key訪問單個元素的速度通常比unordered_set容器慢,但它們允許根據順序對子集進行直接迭代。
  9. set中的元素不允許修改,因為修改了其中的一個元素會改變內部的結構,從而影響有序性。
  10. set在底層是用二叉搜索樹(紅黑樹)實現的。

3.1.1 模板參數列表

在這里插入圖片描述

  • T: set中存放元素的類型,實際在底層存儲<value, value>的鍵值對。
  • Compare:set中元素默認按照小于來比較。
  • Alloc:set中元素空間的管理方式,使用STL提供的空間配置器管理。

3.1.2 構造

1??構造空的set:

set<int> s;

2??用迭代器區間構造:

set<int> s1(s.begin(), s.end());

3??拷貝構造:

set<int> s2(s);

3.1.3 迭代器

1??begin+end
正向遍歷

	set<int> s;s.insert(1);s.insert(3);s.insert(3);s.insert(3);s.insert(5);s.insert(2);set<int>::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;

這里順便檢驗下是否去重且有序:
在這里插入圖片描述

2??rbegin+rend
與上面類似,只不過是反向遍歷

	set<int>::reverse_iterator rit = s.rbegin();while (rit != s.rend()){cout << *rit << " ";++rit;}cout << endl;

在這里插入圖片描述

3.1.4 容量

1??empty
判斷set是否為空,空返回true,否則返回true

	set<int> s;cout << s.empty() << endl;//1

2??size
返回set中有效元素的個數

set<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
s.insert(3);
s.insert(5);
s.insert(2);
cout << s.size() << endl;//4

3.1.5 修改操作

1??insert

pair<iterator,bool> insert ( const value_type& x )

在set中插入元素x,實際插入的是<x, x>構成的鍵值對,如果插入成功,返回<該元素在set中的位置,true>,如果插入失敗,說明x在set中已經存在,返回<x在set中的位置,false>。

set<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{cout << e << " ";
}
cout << endl;

在這里插入圖片描述

2??erase
刪除有三種方式:

刪除set中position位置上的元素

void erase ( iterator position )

set<int> s;
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{cout << e << " ";
}
cout << endl;
set<int>::iterator pos = s.begin();
s.erase(pos);
for (auto& e : s)
{cout << e << " ";
}

在這里插入圖片描述

刪除set中值為x的元素,返回刪除的元素的個數

size_type erase ( const key_type& x )

set<int> s;
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{cout << e << " ";
}
cout << endl;
s.erase(3);
for (auto& e : s)
{cout << e << " ";
}

在這里插入圖片描述

刪除set中[?rst, last)區間中的元素

void erase ( iterator ?rst, iterator last )

set<int> s;
s.insert(1);
s.insert(3);
s.insert(5);
s.insert(2);
for (auto& e : s)
{cout << e << " ";
}
cout << endl;
s.erase(s.begin(), s.end());
for (auto& e : s)
{cout << e << " ";
}

在這里插入圖片描述

3??swap
交換set中的元素

void swap ( set<Key,Compare,Allocator>& st );

	set<int> s1;s1.insert(1);s1.insert(3);s1.insert(5);for (auto& e : s1){cout << e << " ";//1 3 5}cout << endl;set<int> s2;s2.insert(7);s2.insert(8);s2.insert(6);for (auto& e : s2){cout << e << " "; //6 7 8}cout << endl;s2.swap(s1);for (auto& e : s1){cout << e << " ";//6 7 8}cout << endl;for (auto& e : s2){cout << e << " ";//1 3 5}

4??clear
將set中的元素清空

void clear ( )

set<int> s1;
s1.insert(1);
s1.insert(3);
s1.insert(5);
s1.clear();
for (auto& e : s1)
{cout << e << " ";// 空
}

5??find
找到了,返回set中值為x的元素的位置,如果每找到,返回最后一個元素的下一個位置

iterator ?nd ( const key_type& x ) const

set<int> s1;
s1.insert(1);
s1.insert(3);
s1.insert(5);
//s1.clear();
set<int>::iterator pos = s1.find(3);
if (pos != s1.end())cout << "找到了" << endl;//找到了
elsecout << "沒找到" << endl;

6??count
返回set中值為x的元素的個數,因為set是去重的,所以存在返回1,不存在返回0

size_type count ( const key_type& x ) const

set<int> s1;
s1.insert(1);
s1.insert(3);
s1.insert(5);
cout << s1.count(3) << endl;//1
cout << s1.count(33) << endl;//0

3.2 multiset

multiset與set的區別是存儲的元素可以重復

void test_set8()
{multiset<int> s;s.insert(1);s.insert(3);s.insert(3);s.insert(5);s.insert(5);s.insert(5);s.insert(2);for (auto& e : s){cout << e << " ";//1 2 3 3 5 5 5}
}

還有接口與set的不同,分別是find和count

set的find與multiset的find
set不能有重復元素,所以找到了返回該元素的位置;multiset有重復元素,找到了返回該元素的第一個的位置。找不到都是返回end()

multiset<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
multiset<int>::iterator pos = s.find(3);//返回第一個3的位置
while (pos != s.end())
{cout << *pos << " ";// 3 3++pos;
}
cout << endl;
}

set的count與multiset的count
set沒有重復元素,所以存在的元素返回1,不存在返回0;multiset有重復元素,所以存在返回該元素的個數,不存在返回0

multiset<int> s;
s.insert(1);
s.insert(3);
s.insert(3);
s.insert(3);
s.insert(3);
cout << s.count(3) << endl;//4

3.3 map

與sert一樣,map可以使容器的元素有序且去重
特點:

  1. map中的元素是鍵值對,由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中的key是唯一的,并且不能修改
  5. map中通過鍵值訪問單個元素的速度通常比unordered_map容器慢,但map允許根據順序對元素進行直接迭代(即對map中的元素進行迭代時,可以得到一個有序的序列)。
  6. map支持下標訪問符,可以進行插入、查找和修改
  7. map的底層為平衡搜索樹(紅黑樹)

3.3.1 模板參數列表

在這里插入圖片描述

  • key: 鍵值對中key的類型
  • T: 鍵值對中value的類型
  • Compare: 比較器的類型,map中的元素是按照key來比較的,缺省情況下按照小于來比較,一般情況下(內置類型元素)該參數不需要傳遞,如果無法比較時(自定義類型),需要用戶自己顯式傳遞比較規則(一般情況下按照函數指針或者仿函數來傳遞)
  • Alloc:通過空間配置器來申請底層空間,不需要用戶傳遞,除非用戶不想使用標準庫提供的空間配置器

3.3.2 構造

1??構造空的map

map<string, string> m;

2??用迭代器區間進行構造

map<string, string> m1(m.begin(), m.end());

3??拷貝構造

map<string, string> m2(m);

3.3.3 迭代器

1??begin和end
正向遍歷

map<string, string> m;
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("apple", "蘋果"));
m.insert(pair<string, string>("left", "左邊"));
map<string, string>::iterator it = m.begin();
while (it != m.end())
{cout << *it << " ";//錯誤寫法,編譯報錯++it;
}

因為map的每個元素是鍵值對,由key和value組成,即pair,而且它們的類型不一定相同,所以要用 . 或者 -> 指向對應的成員

map<string, string> m;
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("sort", "排序"));
m.insert(pair<string, string>("apple", "蘋果"));
m.insert(pair<string, string>("left", "左邊"));
map<string, string>::iterator it = m.begin();
while (it != m.end())
{//cout << (*it).first << ":" << (*it).second << endl;cout << it->first << ":" << it->second << endl;++it;
}

在這里插入圖片描述

2??rbegin和rend
反向遍歷

map<string, string>::reverse_iterator rit = m.rbegin();
while (rit != m.rend())
{//cout << (*rit).first << ":" << (*rit).second << endl;cout << rit->first << ":" << rit->second << endl;++rit;
}

在這里插入圖片描述

3.3.4 容量

1??empty
檢測map中的元素是否為空,是返回true,否則返回false

map<string, string> m;
cout << m.empty() << endl;//1

2??size
返回map中有效元素的個數

m.insert(pair<string, string>("left", "左邊"));
cout << m.size() << endl;//1

3.3.5 修改操作

1??insert

pair<iterator,bool> insert ( const value_type& x )

在map中插入的是鍵值對,返回值也是鍵值對,如果插入成功,則返回當前元素(鍵值對)的位置和true,插入失敗,則返回原來已有的元素的位置和false

插入的方式有三種寫法:

map<string, string> m;
m.insert(pair<string, string>("sort", "排序"));//C++98
m.insert(make_pair("apple", "蘋果"));//C++98
m.insert({ "left", "左邊" }); //C++11 多參數隱式類型轉換

在這里插入圖片描述

2??erase
刪除有3種方式,與set相同:

刪除position位置上的元素

void erase ( iterator position )

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "蘋果"));
m.insert(make_pair("left", "左邊"));
for (auto& e : m)
{cout << e.first << ":" << e.second << " ";
}
cout << endl;
map<string, string>::iterator pos = m.begin();
m.erase(pos);
for (auto& e : m)
{cout << e.first << ":" << e.second << " ";
}

在這里插入圖片描述

刪除鍵值為x的元素

size_type erase ( const key_type& x )

m.erase("sort");

在這里插入圖片描述

刪除[?rst, last)區間中的元素

void erase ( iterator ?rst, iterator last )

m.erase(m.begin(), m.end());

3??swap
交換兩個map中的元素

void swap ( map<Key,T,Compare,Allocator>& mp )

map<string, string> m1;
m1.insert(make_pair("sort", "排序"));
m1.insert(make_pair("apple", "蘋果"));
for (auto& e : m1)
{cout << e.first << ":" << e.second << " ";
}
map<string, string> m2;
m2.insert(make_pair("left", "左邊"));
m2.insert(make_pair("right", "右邊"));
for (auto& e : m2)
{cout << e.first << ":" << e.second << " ";
}
m2.swap(m1);
for (auto& e : m1)
{cout << e.first << ":" << e.second << " ";
}
for (auto& e : m2)
{cout << e.first << ":" << e.second << " ";
}

在這里插入圖片描述

4??clear
將map中的元素清空

void clear ( )

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.clear();
cout << m.empty() << endl;//1

5??find
查找key為x的元素,找到了返回該元素的迭代器,找不到返回end

iterator ?nd ( const key_type& x )

map<string, string> m;
m.insert(make_pair("sort", "排序"));
map<string, string>::iterator pos = m.find("sort");
if (pos != m.end())cout << "找到了" << endl;//找到了
elsecout << "沒找到" << endl;

6??count
返回key為x在map中的個數,由于map會去重,所以存在返回1,不存在返回0

size_type count ( const key_type& x ) const

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
cout << m.count("sort") << endl;//1
cout << m.count("apple") << endl;//0

3.3.6 operator[]

mapped_type& operator[] (const key_type& k);

該函數的參數是key,返回值是value。可以用來插入、查找、修改和計數。先來看看使用:

1??插入:如果key沒有重復,插入成功

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m["left"];//插入
for (auto& e : m)
{cout << e.first << ":" << e.second << endl;
}

在這里插入圖片描述

2??查找:插入的key已經存在,查找到該key對應的value

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "蘋果"));
cout << m["apple"] << endl;//蘋果

3??修改:插入的key已經存在,同時右邊如下代碼所示,將該key對應的value修改

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "蘋果"));
m["sort"] = "排序的英文";
for (auto& e : m)
{cout << e.first << ":" << e.second << endl;
}

在這里插入圖片描述

4??插入+修改:插入key沒有重復,且右邊如下代碼所示,修改對應的value(其實是補上)

map<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "蘋果"));
m["left"] = "左邊";
for (auto& e : m)
{cout << e.first << ":" << e.second << endl;
}

在這里插入圖片描述

5??統計次數

map<string, int> m;
string arr[] = { "sort","sort" ,"apple" ,"apple", "banana","one" };
for (auto& e : arr)
{m[e]++;
}
for (auto& e : m)
{cout << e.first << ":" << e.second << " ";cout << endl;
}

在這里插入圖片描述

接下來看看operator[]是如何實現以上操作的:
在這里插入圖片描述

operator[]內部其實調用了insert函數
在這里插入圖片描述
我們再來看看insert函數:
在這里插入圖片描述
回顧下,insert函數的要插入的數據類型是鍵值對
在這里插入圖片描述
它的返回類型也是鍵值對,operator[]調用insert函數得到的返回值是迭代器,對迭代器解引用然后點訪問迭代器的第二個成員,最后返回該成員。

梳理下:
首先看operator[]調用insert函數,而insert里面的make_pair是(k, mapped_type()),也就是說key值是要輸入的,而value我們不寫編譯器幫我們默認構造出來,int類型是0。接著insert函數就要返回了,返回的是鍵值對,插入成功,返回該位置的迭代器和true;插入失敗,返回該位置的迭代器和false。.first,得到返回值的第一個成員,即迭代器。迭代器的本質是指針,指針指向的是該位置的key和對應的value,解引用指針,然后最后的 .second 得到是該迭代器的value,即插入的key對應的value

3.4 multimap

multimap與map的區別和multiset與set的區別相同,都能形成有序,但是multimap可以允許元素重復

multimap<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("left", "左邊"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "蘋果"));
m.insert(make_pair("apple", "蘋果"));
for (auto& e : m)
{cout << e.first << ":" << e.second << " ";cout << endl;
}

在這里插入圖片描述

還有find和count:

map的find與multimap的find
map返回該元素的迭代器,multimap返回該元素的第一個的迭代器

multimap<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "蘋果"));
multimap<string, string>::iterator pos = m.find("sort");
while (pos != m.end())
{cout << pos->first << ":" << pos->second << endl;++pos;
}

在這里插入圖片描述

map的count與multimap的count
map沒有重復元素,所以該元素存在返回1,不存在返回0;multimap可以有重復元素,存在返回該元素的個數,不存在返回0

multimap<string, string> m;
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("sort", "排序"));
m.insert(make_pair("apple", "蘋果"));
cout << m.count("sort") << endl;//2
cout << m.count("apple") << endl;//1
cout << m.count("left") << endl;//0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716944.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hololens 2應用開發系列(1)——使用MRTK在Unity中設置混合現實場景并進行程序模擬

Hololens 2應用開發系列&#xff08;1&#xff09;——使用MRTK在Unity中進行程序模擬 一、前言二、創建和設置MR場景三、MRTK輸入模擬的開啟 一、前言 在前面的文章中&#xff0c;我介紹了Hololens 2開發環境搭建和項目生成部署等相關內容&#xff0c;使我們能生成一個簡單Ho…

Redis 之九:Spring Data Redis -- Redis Template 用法

SpringData Redis Spring Data Redis 是 Spring Data 項目的一部分&#xff0c;它為 Java 應用程序提供了一種便捷的方式來與 Redis 數據庫進行交互。 Spring Data Redis 提供了對 Redis 的抽象封裝&#xff0c;使得開發者能夠以面向對象的方式操作 Redis&#xff0c;并簡化了 …

matlab 寫入格式化文本文件

目錄 一、save函數 二、fprintf函數 matlab 寫入文本文件可以使用save和fprintf函數 save輸出結果: fprintf輸出結果: 1.23, 2.34, 3.45 4.56, 5.67, 6.78 7.89, 8.90, 9.01 可以看出fprintf輸出結果更加人性化,符合要求,下面分別介紹。 一、save函數 …

linux系統Jenkins工具介紹

Jenkins概念介紹 Jenkins概念Jenkins目的特性產品發布流程 Jenkins概念 Jenkins是一個功能強大的應用程序&#xff0c;允許持續集成和持續交付項目&#xff0c;無論用的是什么平臺。這是一個免費的源代碼&#xff0c;可以處理任何類型的構建或持續集成。集成Jenkins可以用于一些…

MQL5-MT5連接上國內期貨

主要原因是昨天在學習MACD時發現給的基礎代碼感覺不對&#xff0c;但無法證明&#xff0c;因為MT5接的都是外匯交易&#xff0c;數據和國內的文華啥的全對不上&#xff0c;便找了一些國內接CTP的&#xff0c;直接寫代碼有點麻煩&#xff0c;雖然之前對接過國內CTP的東西&#x…

AI入門筆記(三)

神經網絡是如何工作的 神經網絡又是如何工作的呢&#xff1f;我們用一個例子來解釋。我們看下面這張圖片&#xff0c;我們要識別出這些圖片都是0并不難&#xff0c;要怎么交給計算機&#xff0c;讓計算機和我們得出同樣的結果&#xff1f;難點就在于模式識別的答案不標準&…

十二、Nacos源碼系列:Nacos配置中心原理(四)- RefreshEvent 事件處理

前面文章&#xff0c;我們說到回調監聽器的方法中&#xff0c;主要就是發布了一個RefreshEvent事件&#xff0c;這個事件主要由 SpringCloud 相關類來處理。今天我們繼續分析后續的流程。 RefreshEvent 事件會由 RefreshEventListener 來處理&#xff0c;該 listener 含有一個 …

Object類方法

toString(): 返回對象的字符串表示形式。默認情況下&#xff0c;返回對象的類名和哈希碼的十六進制表示。 equals(Object obj): 比較兩個對象是否相等。默認情況下&#xff0c;這個方法比較的是兩個對象的引用是否相同&#xff0c;但是通常會在子類中重寫這個方法以實現自定義…

武器大師——操作符詳解(下)

目錄 六、單目操作符 七、逗號表達式 八、下標引用以及函數調用 8.1.下標引用 8.2.函數調用 九、結構體 9.1.結構體 9.1.1結構的聲明 9.1.2結構體的定義和初始化 9.2.結構成員訪問操作符 9.2.1直接訪問 9.2.2間接訪問 十、操作符的屬性 10.1.優先性 10.2.結合性 …

sql基本語法+實驗實踐

sql語法 注釋&#xff1a; 單行 --注釋內容# 注釋內容多行 /* 注釋內容 */數據定義語言DDL 查詢所有數據庫 show databases;注意是databases而不是database。 查詢當前數據庫 select database();創建數據庫 create database [if not exists] 數據庫名 [default charset 字符…

備戰藍橋杯Day22 - 計數排序

計數排序問題描述 對列表進行排序&#xff0c;已知列表中的數范圍都在0-100之間。設計時間復雜度為O(n)的算法。 比如列表中有一串數字&#xff0c;2 5 3 1 6 3 2 1 &#xff0c;需要將他們按照從小到大的次序排列&#xff0c;得到1 1 2 2 3 3 5 6 的結果。那么此時計數排序是…

一:面試流程

面試 項目介紹功能測試接口測試性能測試測試用例 項目介紹 南網智搜是南方電網公司研發的搜索引擎&#xff0c;主要場景Web 端場景有搜索頻道、個人中心、和一些積分活動等&#xff0c;我在里面主要負責功能測試&#xff0c;接口測試&#xff0c;性能測試&#xff0c;壓力測試…

Jetson Xavier NX 開發板Ubuntu18.04 安裝arduino IDE詳細步驟

Jetson 平臺是arch架構&#xff0c;官網上面幾乎都是x86或者arm64的這兩種錯誤版本都存在匹配問題無法使用&#xff0c;不要下載不要下載&#xff01; uname -a #版本查詢1.正確下載打開方式 https://downloads.arduino.cc/arduino-1.8.19-linuxaarch64.tar.xz選擇自己想要下…

LeetCode #104 二叉樹的最大深度

104. 二叉樹的最大深度 題目 二叉樹的 最大深度 是指從根節點到最遠葉子節點的最長路徑上的節點數。 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;3 示例 2&#xff1a; 輸入&#xff1a;root [1,null,2] 輸出&#xff1a;2 分析 …

【Godot4自學手冊】第十九節敵人的血量顯示及掉血特效

這一節&#xff0c;我主要學習敵人的血量顯示、掉血顯示和死亡效果。敵人的血量顯示和主人公的血量顯示有所不同&#xff0c;主要是在敵人頭頂有個紅色的血條&#xff0c;受到攻擊敵人的血條會減少&#xff0c;并且有掉血數量的文字顯示&#xff0c;效果如下&#xff1a; 一、…

《中華人民共和國消防法》(2021年修訂版)解讀

單選題&#xff08;共7題&#xff0c;每題5分&#xff09; 1、舉辦大型群眾性活動&#xff0c;承辦人應當依法向&#xff08;&#xff09;申請安全許可。 正確答案&#xff1a;B、公安機關 2、違反消防安全規定進入生產、儲存易燃易爆危險品場所的&#xff0c;情節嚴重的要處…

基于springboot+vue的醫院后臺管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

胎神游戲集第一期

目錄 一、變色小跳龍 二、超級按鈕 三、超級迷宮 四 、城市守衛戰 五、 憤怒的小胎 既然是胎神游戲集&#xff0c;那當然要先感謝我們的胎神大大了 胎神洛谷名&#xff1a;TSzza 好了&#xff0c;言歸正傳&#xff0c;知道你們不喜歡啰嗦&#xff0c;直接上代碼 一、…

SMBGhost漏洞技術分析與防御方案

事件分析 最近國內外各安全廠商都發布了SMBGhost(CVE-2020-0796)漏洞的預警報告和分析報告&#xff0c;筆者利用周末休息時間也研究了一下&#xff0c;就算是做一個筆記了&#xff0c;分享給大家一起學習下&#xff0c;目前外面研究的POC大部分是通過SMB壓縮數據包長度整數溢出…

【openGL4.x手冊04】基元

一、說明 OpenGL 中的術語“基元”用于指代兩個相似但獨立的概念。 “原語”的第一個含義是指 OpenGL 使用的解釋方案來確定渲染時頂點流所代表的內容&#xff0c;例如“GL_POINTS”。這樣的頂點序列可以是任意長的。 “原語”的另一個含義&#xff0c;也稱為“基本原語”&…