国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++ STL之map,set,pair詳解】

這篇具有很好參考價值的文章主要介紹了【C++ STL之map,set,pair詳解】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一.map映射

1.簡介

在C++的STL(Standard Template Library)中,map是一個非常有用的關(guān)聯(lián)容器。它提供了一種鍵-值對的數(shù)據(jù)結(jié)構(gòu),其中的元素按照鍵的順序進行排序,并且每個鍵是唯一的。本文將詳細介紹C++ STL中map的使用方法和一些常見操作。

2.包含頭文件及其初始化

(1)頭文件

#include <map>

(2)初始化方法
可以使用以下方式聲明和初始化一個map對象:

map<KeyType, ValueType> myMap; // 聲明一個空的map
map<string,string> mp;
map<string,int> mp;
map<int,node> mp;//node是結(jié)構(gòu)體類型

也可以使用已有的鍵值對初始化map對象

std::map<KeyType, ValueType> myMap = {
    {key1, value1},
    {key2, value2},
    {key3, value3}
};

3.基本操作

代碼 含義
mp.find(key) 返回鍵為key的映射的迭代器 注意:用find函數(shù)來定位數(shù)據(jù)出現(xiàn)位置,它返回一個迭代器。當(dāng)數(shù)據(jù)存在時,返回數(shù)據(jù)所在位置的迭代器,數(shù)據(jù)不存在時,返回mp.end()
mp.erase(it) 刪除迭代器對應(yīng)的鍵和值
mp.erase(key) 根據(jù)映射的鍵刪除鍵和值
mp.erase(first,last) 刪除左閉右開區(qū)間迭代器對應(yīng)的鍵和值
mp.size() 返回映射的對數(shù)
mp.clear() 清空map中的所有元素
mp.insert() 插入元素,插入時要構(gòu)造鍵值對
mp.empty() 如果map為空,返回true,否則返回false
mp.begin() 返回指向map第一個元素的迭代器
mp.end() 返回指向map尾部的迭代器(最后一個元素的下一個地址)
mp.rbegin() 返回指向map最后一個元素的反向迭代器
mp.rend() 返回指向map第一個元素前面(上一個)的反向迭代器(地址)
mp.count(key) 查看元素是否存在,存在返回1,不存在返回0
mp.lower_bound() 返回一個迭代器,指向鍵值>= key的第一個元素(只比較鍵)
mp.upper_bound() 返回一個迭代器,指向鍵值> key的第一個元素(只比較鍵)

接下來將給出相對應(yīng)代碼來幫助理解
(1)使用insert()函數(shù)添加單個鍵值對:

myMap.insert(std::make_pair(key, value));

(2)使用下標(biāo)運算符[ ]添加或更新鍵值對:

myMap[key] = value;

(3)使用erase()函數(shù)刪除指定鍵的元素:

myMap.erase(key);

(4)使用find()函數(shù)查找指定鍵的元素,返回指向該元素的迭代器:

auto it = myMap.find(key);
if (it != myMap.end()) {
    // 找到了該鍵對應(yīng)的元素
    ValueType value = it->second;
}

(5)使用lower_bound()函數(shù)查找大于等于指定鍵的第一個元素的迭代器:

auto it = myMap.lower_bound(key);
if (it != myMap.end()) {
    // 找到了大于等于指定鍵的第一個元素
    KeyType foundKey = it->first;
    ValueType foundValue = it->second;
}

(6)使用upper_bound()函數(shù)查找大于指定鍵的第一個元素的迭代器:

auto it = myMap.upper_bound(key);
if (it != myMap.end()) {
    // 找到了大于指定鍵的第一個元素
    KeyType foundKey = it->first;
    ValueType foundValue = it->second;
}

4.用迭代器正反遍歷

(正向遍歷)

map<int,int> mp;
mp[1] = 2;
mp[2] = 3;
mp[3] = 4;
auto it = mp.begin();
while(it != mp.end())
{
	cout << it->first << " " << it->second << "\n";
	it ++;
}

(反向遍歷)

map<int,int> mp;
mp[1] = 2;
mp[2] = 3;
mp[3] = 4;
auto it = mp.rbegin();
while(it != mp.rend())
{
	cout << it->first << " " << it->second << "\n";
	it ++;
}

5.添加元素的四種方式

//先聲明
map<string,string> mp;
mp["學(xué)習(xí)"] = "看書";//第一種
mp["玩耍"] = "打游戲";
mp.insert(make_pair("vegetable","蔬菜"));//第二種
mp.insert(pair<string,string>("fruit","水果"));//第三種
mp.insert({"hahaha","wawawa"});//第四種

6.元素的訪問

(1)迭代器訪問

int main() {
    std::map<int, std::string> myMap = {
        {1, "Alice"},
        {2, "Bob"},
        {3, "Charlie"}
    };
    // 使用迭代器進行遍歷和訪問
    for (auto it = myMap.begin(); it != myMap.end(); ++it) {
        int key = it->first;            // 訪問鍵
        string value = it->second;     // 訪問值
        cout << key << ": " << value << std::endl;
    }
    return 0;
}

(2)智能指針訪問

for(auto i : mp)
cout << i.first << " " << i.second << endl;//鍵,值

(3)單個訪問

map<char,int>::iterator it = mp.find('a');
cout << it -> first << " " <<  it->second << "\n";

(4)c++17特性才具有

for(auto [x, y] : mp)
	cout << x << " " << y << "\n";
//x,y對應(yīng)鍵和值

7.對比unordered_map,multimap

1.map:map是一個有序的關(guān)聯(lián)容器,其中的元素按照鍵的順序進行排序。每個鍵是唯一的,不允許重復(fù)。map使用紅黑樹實現(xiàn),插入和查找操作的時間復(fù)雜度為O(log n)。

2.unordered_map:unordered_map是一個無序的關(guān)聯(lián)容器,其中的元素沒有特定的順序。每個鍵是唯一的,不允許重復(fù)。unordered_map使用哈希表實現(xiàn),插入和查找操作的平均時間復(fù)雜度為O(1),最壞情況下為O(n)。(也是用哈希表實現(xiàn))

3.multimap:multimap是一個有序的關(guān)聯(lián)容器,其中的元素按照鍵的順序進行排序。允許鍵重復(fù),即可以有相同的鍵。multimap使用紅黑樹實現(xiàn),插入和查找操作的時間復(fù)雜度為O(log n)。

4.unordered_multimap:unordered_multimap是一個無序的關(guān)聯(lián)容器,其中的元素沒有特定的順序。允許鍵重復(fù),即可以有相同的鍵。unordered_multimap使用哈希表實現(xiàn),插入和查找操作的平均時間復(fù)雜度為O(1),最壞情況下為O(n)。
對比優(yōu)劣:

(1)map和unordered_map都提供了快速的查找操作,但是在插入和刪除操作上,unordered_map通常比map更快。

(2)unordered_map的元素沒有特定的順序,適用于不需要保持順序的場景。而map的元素是有序的,適用于需要按照鍵的順序進行訪問的場景。

(3)multimap和unordered_multimap允許鍵重復(fù),適用于需要存儲相同鍵的場景。multimap保持元素的有序性,而unordered_multimap沒有特定的順序。

(4)在空間占用上,哈希表實現(xiàn)的容器(unordered_map和unordered_multimap)通常需要更多的內(nèi)存,而紅黑樹實現(xiàn)的容器(map和multimap)通常需要較少的內(nèi)存。

選擇使用哪種容器取決于具體的需求。如果需要有序訪問或者需要保持元素的有序性,可以選擇map或multimap。如果對元素的順序沒有特定要求,但需要快速的插入和查找操作,可以選擇unordered_map或unordered_multimap。

二.set集合

1.簡介

在C++的STL(Standard Template Library)中,set是一個非常有用的關(guān)聯(lián)容器。它提供了一種有序集合的數(shù)據(jù)結(jié)構(gòu),其中的元素按照鍵的順序進行排序,并且每個鍵是唯一的。本文將詳細介紹C++ STL中set的使用方法和一些常見操作。

2.包含頭文件及其初始化

(1)頭文件

#include <set>

(2)初始化

std::set<KeyType> mySet; // 聲明一個空的set
std::set<KeyType> mySet = {element1, element2, element3};//也可以使用已有的元素初始化set對象:

3.基本操作

代碼 含義
s.begin() 返回set容器的第一個元素的地址(迭代器)
s.end() 返回set容器的最后一個元素的下一個地址(迭代器)
s.rbegin() 返回逆序迭代器,指向容器元素最后一個位置
s.rend() 返回逆序迭代器,指向容器第一個元素前面的位置
s.clear() 刪除set容器中的所有的元素,返回unsigned int類型
s.empty() 判斷set容器是否為空
s.insert() 插入一個元素
s.size() 返回當(dāng)前set容器中的元素個數(shù)
erase(iterator) 刪除定位器iterator指向的值
erase(first,second) 刪除定位器first和second之間的值(左閉右開)
erase(key_value) 刪除鍵值key_value的值
s.find(元素) 查找set中的某一元素,有則返回該元素對應(yīng)的迭代器,無則返回end()
s.lower_bound(k) 返回大于等于k的第一個元素的迭代器
s.upper_bound(k) 返回大于k的第一個元素的迭代器訪問

接下來將給出相對應(yīng)代碼來幫助理解

1.插入元素
mySet.insert(element);
mySet.insert(beginIterator, endIterator);

2.刪除元素
mySet.erase(value);
mySet.erase(beginIterator, endIterator);//注意左閉右開

3.查找元素
auto it = mySet.find(value);
if (it != mySet.end()) {
    // 找到了該值對應(yīng)的元素
}

auto it = mySet.lower_bound(value);
if (it != mySet.end()) {
    // 找到了大于等于指定值的第一個元素
}

auto it = mySet.upper_bound(value);
if (it != mySet.end()) {
    // 找到了大于指定值的第一個元素
}

4.元素的訪問

(1)迭代器訪問

for(set<int>::iterator it=s.begin();it!=s.end();it++)
	cout<<*it<<" ";

(2)智能指針

for(auto i : s)
	cout<<i<<endl;

(3)訪問最后一個元素

//第一種
cout<<*s.rbegin()<<endl;

 //第二種
set<int>::iterator iter = s.end();
iter--;
cout<<(*iter)<<endl; //打印2;

//第三種
cout<<*(--s.end())<<endl;

5.set,multiset,unordered_set,unordered_multiset 比較

1.set:有序的關(guān)聯(lián)容器,每個元素都是唯一的。使用紅黑樹實現(xiàn),插入和查找的時間復(fù)雜度為O(log n)。元素按照鍵的順序進行排序。

2.multiset:有序的關(guān)聯(lián)容器,允許元素重復(fù)。使用紅黑樹實現(xiàn),插入和查找的時間復(fù)雜度為O(log n)。元素按照鍵的順序進行排序。

3.unordered_set:無序的關(guān)聯(lián)容器,每個元素都是唯一的。使用哈希表實現(xiàn),插入和查找的平均時間復(fù)雜度為O(1),最壞情況下為O(n)。元素沒有特定的順序。

4.unordered_multiset:無序的關(guān)聯(lián)容器,允許元素重復(fù)。使用哈希表實現(xiàn),插入和查找的平均時間復(fù)雜度為O(1),最壞情況下為O(n)。元素沒有特定的順序。

總結(jié):
set和multiset是有序的,元素按照鍵的順序進行排序,multiset允許元素重復(fù)。
unordered_set和unordered_multiset是無序的,元素沒有特定的順序,unordered_multiset允許元素重復(fù)。
set和unordered_set的查找和插入操作的時間復(fù)雜度較低,適用于需要快速查找和插入的場景。
multiset和unordered_multiset允許元素重復(fù),適用于需要存儲相同鍵的場景。
unordered_set和unordered_multiset在插入和查找操作上通常比set和multiset更快,但它們沒有保持元素的有序性。

三.pair二元組

1.簡介

在C++的STL(Standard Template Library)中,pair是一個非常有用的模板類。它提供了一種簡單的方式來存儲一對值,即鍵值對。pair可以用于各種場景,例如在容器中存儲關(guān)聯(lián)的數(shù)據(jù),返回多個值等。本文將詳細介紹C++ STL中pair的使用方法和一些常見操作。

2.包含頭文件及其初始化

(1)頭文件

#include <utility>

(2)初始化

pair<Type1, Type2> myPair; // 聲明一個空的pair
pair<Type1, Type2> myPair(value1, value2); // 使用給定的值初始化pair
myPair = std::make_pair(value1, value2); // 使用make_pair函數(shù)創(chuàng)建pair并賦值

3.訪問與修改

//定義結(jié)構(gòu)體數(shù)組
pair<int,int>p[20];
for(int i = 0; i < 20; i++)
{
	//和結(jié)構(gòu)體類似,first代表第一個元素,second代表第二個元素
	cout << p[i].first << " " << p[i].second;
}

pair可以作為容器(例如vector、list、map等)的元素使用。這樣可以方便地存儲和訪問關(guān)聯(lián)的數(shù)據(jù)。
下面是一個使用pair作為容器元素的示例代碼:

int main() {
    vector<pair<int, string>> myVector;
    // 添加pair元素
    myVector.push_back(make_pair(1, "Alice"));
    myVector.push_back(make_pair(2, "Bob"));
    myVector.push_back(make_pair(3, "Charlie"));
    // 遍歷輸出pair元素
    for (const auto& pair : myVector) {
        cout << "Key: " << pair.first << ", Value: " << pair.second << std::endl;
    }
    return 0;
}

在上述示例代碼中,我們創(chuàng)建了一個vector容器myVector,其中的元素是pair類型,包含一個整數(shù)和一個字符串。
然后,我們使用push_back()函數(shù)向容器中添加了一些pair元素。
最后,我們使用范圍遍歷來輸出容器中的pair元素。文章來源地址http://www.zghlxwxcb.cn/news/detail-661758.html

到了這里,關(guān)于【C++ STL之map,set,pair詳解】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C++高級編程——STL:list容器、set容器和map容器

    本專欄記錄C++學(xué)習(xí)過程包括C++基礎(chǔ)以及數(shù)據(jù)結(jié)構(gòu)和算法,其中第一部分計劃時間一個月,主要跟著黑馬視頻教程,學(xué)習(xí)路線如下, 不定時更新,歡迎關(guān)注 。 當(dāng)前章節(jié)處于: ---------第1階段-C++基礎(chǔ)入門 ---------第2階段實戰(zhàn)-通訊錄管理系統(tǒng), ---------第3階段-C++核心編程, -----

    2024年01月25日
    瀏覽(23)
  • 【C++】STL——用一顆紅黑樹封裝出map和set

    【C++】STL——用一顆紅黑樹封裝出map和set

    我們都知道set是K模型的容器,而map是KV模型的容器,但是它倆的底層都是用紅黑樹實現(xiàn)的,上篇博文中我們模擬實現(xiàn)了一顆紅黑樹,接下來將對其進行改造,繼而用一顆紅黑樹封裝出map和set。 本質(zhì)上map和set其內(nèi)部的主要功能都是套用了紅黑樹現(xiàn)成的接口,只是稍作改動即可

    2023年04月15日
    瀏覽(18)
  • 【C++】 使用紅黑樹模擬實現(xiàn)STL中的map與set

    【C++】 使用紅黑樹模擬實現(xiàn)STL中的map與set

    前面的文章我們學(xué)習(xí)了紅黑樹,也提到了C++STL中的map和set的底層其實就是用的紅黑樹來實現(xiàn)的(而map和set的使用我們前面也學(xué)過了)。 既然紅黑樹我們也學(xué)習(xí)過了,那這篇文章我們就用紅黑樹來簡單實現(xiàn)一下STL中的map和set,重點是學(xué)習(xí)它的框架。 上一篇文章我們實現(xiàn)了紅黑

    2024年02月12日
    瀏覽(23)
  • C++:stl中set(multiset)和map(multimap)的介紹和使用

    C++:stl中set(multiset)和map(multimap)的介紹和使用

    本文主要從概念、常用接口和使用方法方面介紹set(multiset)和map(multimap)。 目錄 一、概念介紹 1.關(guān)聯(lián)式容器 2.鍵值對 3. 樹形結(jié)構(gòu)的關(guān)聯(lián)式容器 二、set和multiset 1.set的介紹 2.set使用 1. set模板參數(shù)列表 2. set構(gòu)造 3. set迭代器 4. set容量 5. set修改操作 6.set使用舉例 3.multiset介紹 4.mul

    2024年02月08日
    瀏覽(25)
  • 【C++練級之路】【Lv.17】【STL】set類和map類的模擬實現(xiàn)

    【C++練級之路】【Lv.17】【STL】set類和map類的模擬實現(xiàn)

    快樂的流暢:個人主頁 個人專欄:《C語言》《數(shù)據(jù)結(jié)構(gòu)世界》《進擊的C++》 遠方有一堆篝火,在為久候之人燃燒! STL庫中的set類和map類,其底層原理都是 通過紅黑樹來實現(xiàn) 的。盡管set和map可以各自實現(xiàn)一棵紅黑樹,但是為了提高代碼的復(fù)用率,STL庫中將紅黑樹進行了一定

    2024年04月16日
    瀏覽(30)
  • 【C++進階04】STL中map、set、multimap、multiset的介紹及使用

    【C++進階04】STL中map、set、multimap、multiset的介紹及使用

    vector/list/deque… 這些容器統(tǒng)稱為 序列式容器 因為其底層為線性序列的數(shù)據(jù)結(jié)構(gòu) 里面存儲的是元素本身 map/set… 這些容器統(tǒng)稱為 關(guān)聯(lián)式容器 關(guān)聯(lián)式容器也是用來存儲數(shù)據(jù)的 與序列式容器不同的是 其里面存儲的是key, value結(jié)構(gòu)的鍵值對 在數(shù)據(jù)檢索時比序列式容器效率更高 “鍵

    2024年02月03日
    瀏覽(24)
  • 【C++入門到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入門 ]

    【C++入門到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入門 ]

    歡迎各位大佬們的關(guān)顧,本文將介紹unordered系列容器以及其中的兩個重要成員: unordered_map 和 unordered_set 。unordered_map是一種無序的關(guān)聯(lián)容器,它使用哈希表來存儲鍵值對,并提供高效的插入、查找和刪除操作。在本文中,我們將首先介紹unordered_map的基本概念和特點,然后詳

    2024年02月08日
    瀏覽(20)
  • 【C++】STL——用一個哈希表封裝出unordered_map和unordered_set

    【C++】STL——用一個哈希表封裝出unordered_map和unordered_set

    根據(jù)先前對unordered_map和unordered_set的學(xué)習(xí),我們得知其底層是借助哈希表來實現(xiàn)的,接下來我們會使用上篇博客實現(xiàn)的開散列哈希表來模擬實現(xiàn)unordered_map和unordered_set,哈希表源代碼鏈接: Hash/Hash/HashBucket.h · wei/cplusplus - 碼云 - 開源中國 (gitee.com) 下面我們對哈希表進行改造,

    2023年04月18日
    瀏覽(26)
  • C++STL詳解(十) -- 使用哈希表封裝unordered_set和unordered_map

    C++STL詳解(十) -- 使用哈希表封裝unordered_set和unordered_map

    因為不同容器的類型不同,如果是unordered_map,V代表一個鍵值對,如果unordered_set,V代表Key值,而底層哈希表并不知道上層容器所要傳遞的V模板參數(shù)類型,為了與哈希表的模板參數(shù)區(qū)分,我們將哈希表中的V模板參數(shù)改為T. 例如: 在哈希表中當(dāng)我們使用Find函數(shù)進行查找時: 如果上層傳遞的

    2024年02月01日
    瀏覽(39)
  • 詳解 C++中STL的map/multimap

    ap容器中所有元素都是pair,pair中第一個元素為key(鍵值),起到索引作用,第二個元素為value(實值)。 同時,所有元素都會根據(jù)元素的鍵值自動排序。 map/multimap屬于關(guān)聯(lián)式容器,底層數(shù)據(jù)結(jié)構(gòu)是用二叉樹實現(xiàn)的。它的優(yōu)點就是可以根據(jù)key值快速找到value值。 這里需要了解map與

    2024年02月16日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包