網站首頁 編程語言 正文
1、map容器
map是C++ STL的一個關聯容器,它提供一對一的數據處理能力。其中,各個鍵值對的鍵和值可以是任意數據類型,包括 C++ 基本數據類型(int、double 等)、使用結構體或類自定義的類型。
第一個可以稱為關鍵字(key);
第二個可能稱為該關鍵字的值(value);
該容器存儲的都是 pair<const K, T> 類型(其中 K 和 T 分別表示鍵和值的數據類型)的鍵值對元素。
使用 map 容器存儲的各個鍵值對,鍵的值既不能重復也不能被修改。換句話說,map 容器中存儲的各個鍵值對不僅鍵的值獨一無二,鍵的類型也會用 const 修飾,這意味著只要鍵值對被存儲到 map 容器中,其鍵的值將不能再做任何修改。
2、map容器原理
map容器的實現是自建了一顆紅黑樹,這顆樹具有對數據自動排序的功能,在map內部所有的數據都是有序的
3、map容器函數接口
begin()返回指向map頭部的迭代器
clear()刪除所有元素
count()返回指定元素出現的次數
empty()如果map為空則返回true
end()返回指向map末尾的迭代器
equal_range()返回特殊條目的迭代器對
erase()刪除一個元素
find()查找一個元素
get_allocator()返回map的配置器
insert()插入元素
key_comp()返回比較元素key的函數
lower_bound()返回鍵值>=給定元素的第一個位置
max_size()返回可以容納的最大元素個數
rbegin()返回一個指向map尾部的逆向迭代器
rend()返回一個指向map頭部的逆向迭代器
size()返回map中元素的個數
swap()交換兩個map
upper_bound()返回鍵值>給定元素的第一個位置
value_comp()返回比較元素value的函數
#include<map>
map<key, value> m;//創建一個名為m的空map對象,其鍵和值的類型分別為key和value。
map<key, value> m(m2);//創建m2的副本m,m與m2必須有相同的鍵類型和值類型。
map<key, value> m(b,e);//創建map類型的對象m,存儲迭代器b和e標記的范圍內所有元素的副本,元素的類型必須能轉換為pair
//查
m.count(k);// 返回m中鍵值等于k的元素的個數。
m.find(k);// 如果m中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回結束游標end()。
//刪
//迭代器刪除
iter = m.find("123");
m.erase(iter);
//用關鍵字刪除
int n = m.erase("123"); //如果刪除了會返回1,否則返回0
//用迭代器范圍刪除 : 把整個map清空
m.erase(m.begin(), m.end());
//等同于m.clear()
m.erase(k); // 刪除m中鍵為k的元素,返回size_type類型的值,表示刪除元素的個數。
m.erase(p); // 從m中刪除迭代器p所指向的元素,p必須指向m中確實存在的元素,而且不能等于m.end(),返回void類型。
m.erase(iterator first, iterator last); // 刪除一個范圍,返回void類型。
//插入
// 第一種 用insert函數插入pair
m.insert(pair<int, string>(000, "student_zero"));
// 第二種 用insert函數插入value_type數據
m.insert(map<int, string>::value_type(001, "student_one"));
// 第三種 用"array"方式插入
m[123] = "student_first";
m[456] = "student_second";
m.insert(e) ;
e是一個用在m上的value_type類型的值。如果鍵e.first不在m中,則插入一個值為e.second的新元素;如果該鍵在m中已存在,那么不進行任何操作。該函數返回一個pair類型對象,包含指向鍵為e.first的元素的map迭代器,以及一個bool類型的對象,表示是否插入了該元素。
m.insert(beg, end);
beg和end是標記元素范圍的迭代器,對于該范圍內的所有元素,如果它的鍵在m中不存在,則將該鍵及其關聯的值插入到m。 返回void類型。
m.insert(iter, e);
e是value_type類型的值,如果e.first不在m中,則創建新元素,并以迭代器iter為起點搜索新元素存儲的位置,返回一個迭代器,指向m中具有給定鍵的元素。 在添加新的map元素時,使用insert成員可避免使用下標操作符帶來的副作用:不必要的初始化。
//在往map里面插入了數據,我們怎么知道當前已經插入了多少數據呢,可以用size函數,用法如下:int nSize = mapStudent.size();
pair<map<int,string>::iterator,bool>Insert_Pair;
Insert_Pair=mapStudent.insert(map<int,string>::value_type(1, "student_one"));
我們通過pair的第二個變量來知道是否插入成功,它的第一個變量返回的是一個map的迭代器,如果插入成功的話Insert_Pair.second應該是true的,否則為false。
4、使用示例
(1)插入
- insert 函數插入 pair 數據
std::map < int , std::string > mapPerson;
mapPerson.insert(pair < int,string > (1,"Jim"));
- insert 函數插入 value_type 數據
mapPerson.insert(std::map < int, std::string > ::value_type (2, "Tom"));
- 用數組方式插入數據
mapPerson[3] = "Jerry";
(2)遍歷
前向迭代器
std::map < int ,std::string > ::iterator it;
std::map < int ,std::string > ::iterator itEnd;
it = mapPerson.begin();
itEnd = mapPerson.end();
while (it != itEnd)
{
cout<<it->first<<' '<<it->second<<endl;
it++;
}
反向迭代器
std::map < int, string > ::reverse_iterator iter;
for(iter = mapPerson.rbegin(); iter != mapPerson.rend(); iter++)
cout<<iter->first<<" "<<iter->second<<endl;
數組形式
mapPerson.insert(std::map<int, std::string>::value_type (1, "Tom"));
mapPerson[2] = "Jim";
mapPerson[3] = "Jerry";
int nSize = mapPerson.size();
for(int n = 1; n <= nSize; n++)
qDebug()<<QString::fromStdString(mapPerson[n]);
(3)查找
三種數據查找方法
第一種:用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置,由于map的特性,一對一的映射關系,就決定了count函數的返回值只有兩個,要么是0,要么是1,出現的情況,當然是返回1了
第二種:用find函數來定位數據出現位置,它返回的一個迭代器,當數據出現時,它返回數據所在位置的迭代器,如果map中沒有要查找的數據,它返回的迭代器等于end函數返回的迭代器。
查找map中是否包含某個關鍵字條目用find()方法,傳入的參數是要查找的key,在這里需要提到的是begin()和end()兩個成員,
分別代表map對象中第一個條目和最后一個條目,這兩個數據的類型是iterator.
通過map對象的方法獲取的iterator數據類型是一個std::pair對象,包括兩個數據 iterator->first和 iterator->second分別代表關鍵字和存儲的數據。
map<int ,string > ::iterator l_it;;
l_it = maplive.find(112);
if(l_it == maplive.end())
cout<<"we do not find 112"<<endl;
else cout<<"wo find 112"<<endl;
第三種:這個方法用來判定數據是否出現,是顯得笨了點,
lower_bound函數用法,這個函數用來返回要查找關鍵字的下界(是一個迭代器)
upper_bound函數用法,這個函數用來返回要查找關鍵字的上界(是一個迭代器)
例如:map中已經插入了1,2,3,4的話,如果lower_bound(2)的話,返回的2,
而upper-bound(2)的話,返回的就是3
Equal_range函數返回一個pair,pair里面第一個變量是Lower_bound返回的迭代器,pair里面第二個迭代器是Upper_bound返回的迭代器,如果這兩個迭代器相等的話,則說明map中不出現這個關鍵字,
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
map<int, string> mapStudent;
mapStudent[1] = "student_one";
mapStudent[3] = "student_three";
mapStudent[5] = "student_five";
map<int, string>::iterator iter;
iter = mapStudent.lower_bound(1);
//返回的是下界1的迭代器
cout<<iter->second<<endl;
iter = mapStudent.lower_bound(2);
//返回的是下界3的迭代器
cout<<iter->second<<endl;
iter = mapStudent.lower_bound(3);
//返回的是下界3的迭代器
cout<<iter->second<<endl;
iter = mapStudent.upper_bound(2);
//返回的是上界3的迭代器
cout<<iter->second<<endl;
iter = mapStudent.upper_bound(3);
//返回的是上界5的迭代器
cout<<iter->second<<endl;
pair<map<int, string>::iterator, map<int, string>::iterator> mappair;
mappair = mapStudent.equal_range(2);
if(mappair.first == mappair.second)
cout<<"Do not Find"<<endl;
else
cout<<"Find"<<endl;
mappair = mapStudent.equal_range(3);
if(mappair.first == mappair.second)
cout<<"Do not Find"<<endl;
else
cout<<"Find"<<endl;
return 0;
}
(4)刪除
iterator erase(iterator it) ;//通過一個條目對象刪除
iterator erase(iterator first,iterator last); //刪除一個范圍
size_type erase(const Key&key); //通過關鍵字刪除
clear();//就相當于enumMap.erase(enumMap.begin(),enumMap.end());
原文鏈接:https://blog.csdn.net/wteruiycbqqvwt/article/details/124614998
相關推薦
- 2022-10-07 Android調用系統圖庫獲取圖片的方法_Android
- 2022-06-02 Python導包模塊報錯的問題解決_python
- 2023-07-15 React 中的 context使用方法
- 2022-11-18 詳解C語言內核字符串拷貝與比較_C 語言
- 2023-08-15 解決:Unexpected ‘debugger‘ statement.eslint(no-debug
- 2022-08-13 electron功能實現---添加全局快捷鍵、開機自啟、選擇安裝路徑
- 2023-01-20 基于?Dubbo?Admin?動態調整服務超時時間的操作步驟_其它綜合
- 2022-12-01 關于Linux之grep查找文本時匹配反斜杠\轉義問題_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支