欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++深入分析STL中map容器的使用

 更新時間:2022年05月09日 09:55:35   作者:panamera12  
map在編程中是經(jīng)常使用的一個容器,本文來講解一下STL中的map,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1、map容器

map是C++ STL的一個關聯(lián)容器,它提供一對一的數(shù)據(jù)處理能力。其中,各個鍵值對的鍵和值可以是任意數(shù)據(jù)類型,包括 C++ 基本數(shù)據(jù)類型(int、double 等)、使用結構體或類自定義的類型。

第一個可以稱為關鍵字(key);

第二個可能稱為該關鍵字的值(value);

該容器存儲的都是 pair<const K, T> 類型(其中 K 和 T 分別表示鍵和值的數(shù)據(jù)類型)的鍵值對元素。

使用 map 容器存儲的各個鍵值對,鍵的值既不能重復也不能被修改。換句話說,map 容器中存儲的各個鍵值對不僅鍵的值獨一無二,鍵的類型也會用 const 修飾,這意味著只要鍵值對被存儲到 map 容器中,其鍵的值將不能再做任何修改。

2、map容器原理

map容器的實現(xiàn)是自建了一顆紅黑樹,這顆樹具有對數(shù)據(jù)自動排序的功能,在map內(nèi)部所有的數(shù)據(jù)都是有序的

3、map容器函數(shù)接口

begin()返回指向map頭部的迭代器

clear()刪除所有元素

count()返回指定元素出現(xiàn)的次數(shù)

empty()如果map為空則返回true

end()返回指向map末尾的迭代器

equal_range()返回特殊條目的迭代器對

erase()刪除一個元素

find()查找一個元素

get_allocator()返回map的配置器

insert()插入元素

key_comp()返回比較元素key的函數(shù)

lower_bound()返回鍵值>=給定元素的第一個位置

max_size()返回可以容納的最大元素個數(shù)

rbegin()返回一個指向map尾部的逆向迭代器

rend()返回一個指向map頭部的逆向迭代器

size()返回map中元素的個數(shù)

swap()交換兩個map

upper_bound()返回鍵值>給定元素的第一個位置

value_comp()返回比較元素value的函數(shù)

#include<map>

map<key, value> m;//創(chuàng)建一個名為m的空map對象,其鍵和值的類型分別為key和value。

map<key, value> m(m2);//創(chuàng)建m2的副本m,m與m2必須有相同的鍵類型和值類型。

map<key, value> m(b,e);//創(chuàng)建map類型的對象m,存儲迭代器b和e標記的范圍內(nèi)所有元素的副本,元素的類型必須能轉換為pair

//查

m.count(k);// 返回m中鍵值等于k的元素的個數(shù)。

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類型的值,表示刪除元素的個數(shù)。

m.erase(p); // 從m中刪除迭代器p所指向的元素,p必須指向m中確實存在的元素,而且不能等于m.end(),返回void類型。

m.erase(iterator first, iterator last); // 刪除一個范圍,返回void類型。

//插入

// 第一種 用insert函數(shù)插入pair

m.insert(pair<int, string>(000, "student_zero"));

// 第二種 用insert函數(shù)插入value_type數(shù)據(jù)

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中已存在,那么不進行任何操作。該函數(shù)返回一個pair類型對象,包含指向鍵為e.first的元素的map迭代器,以及一個bool類型的對象,表示是否插入了該元素。

m.insert(beg, end);

beg和end是標記元素范圍的迭代器,對于該范圍內(nèi)的所有元素,如果它的鍵在m中不存在,則將該鍵及其關聯(lián)的值插入到m。 返回void類型。

m.insert(iter, e);

e是value_type類型的值,如果e.first不在m中,則創(chuàng)建新元素,并以迭代器iter為起點搜索新元素存儲的位置,返回一個迭代器,指向m中具有給定鍵的元素。 在添加新的map元素時,使用insert成員可避免使用下標操作符帶來的副作用:不必要的初始化。

//在往map里面插入了數(shù)據(jù),我們怎么知道當前已經(jīng)插入了多少數(shù)據(jù)呢,可以用size函數(shù),用法如下: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 函數(shù)插入 pair 數(shù)據(jù)

std::map < int , std::string > mapPerson;

mapPerson.insert(pair < int,string > (1,"Jim"));

  • insert 函數(shù)插入 value_type 數(shù)據(jù)

mapPerson.insert(std::map < int, std::string > ::value_type (2, "Tom"));

  • 用數(shù)組方式插入數(shù)據(jù)

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; 

數(shù)組形式

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)查找

三種數(shù)據(jù)查找方法

第一種:用count函數(shù)來判定關鍵字是否出現(xiàn),其缺點是無法定位數(shù)據(jù)出現(xiàn)位置,由于map的特性,一對一的映射關系,就決定了count函數(shù)的返回值只有兩個,要么是0,要么是1,出現(xiàn)的情況,當然是返回1了

第二種:用find函數(shù)來定位數(shù)據(jù)出現(xiàn)位置,它返回的一個迭代器,當數(shù)據(jù)出現(xiàn)時,它返回數(shù)據(jù)所在位置的迭代器,如果map中沒有要查找的數(shù)據(jù),它返回的迭代器等于end函數(shù)返回的迭代器。

查找map中是否包含某個關鍵字條目用find()方法,傳入的參數(shù)是要查找的key,在這里需要提到的是begin()和end()兩個成員,

分別代表map對象中第一個條目和最后一個條目,這兩個數(shù)據(jù)的類型是iterator.

通過map對象的方法獲取的iterator數(shù)據(jù)類型是一個std::pair對象,包括兩個數(shù)據(jù) iterator->first和 iterator->second分別代表關鍵字和存儲的數(shù)據(jù)。

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;

第三種:這個方法用來判定數(shù)據(jù)是否出現(xiàn),是顯得笨了點,

lower_bound函數(shù)用法,這個函數(shù)用來返回要查找關鍵字的下界(是一個迭代器)

upper_bound函數(shù)用法,這個函數(shù)用來返回要查找關鍵字的上界(是一個迭代器)

例如:map中已經(jīng)插入了1,2,3,4的話,如果lower_bound(2)的話,返回的2,

而upper-bound(2)的話,返回的就是3

Equal_range函數(shù)返回一個pair,pair里面第一個變量是Lower_bound返回的迭代器,pair里面第二個迭代器是Upper_bound返回的迭代器,如果這兩個迭代器相等的話,則說明map中不出現(xiàn)這個關鍵字,

#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());

到此這篇關于C++深入分析STL中map容器的使用的文章就介紹到這了,更多相關C++STL中map容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 深入Linux grep指令的詳解(實用型)

    深入Linux grep指令的詳解(實用型)

    本篇文章是對Linux下的grep指令進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言中%c與%s的區(qū)別與劃分詳解

    C語言中%c與%s的區(qū)別與劃分詳解

    這篇文章主要介紹了C語言中%c與%s的區(qū)別與劃分詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問題詳細總結

    C++用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問題詳細總結

    以下是對C++中用指針變量作為函數(shù)的參數(shù)接受數(shù)組的值的問題進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++實現(xiàn)簡單版通訊錄管理系統(tǒng)

    C++實現(xiàn)簡單版通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單版通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 在C++中使用HP-Socket

    在C++中使用HP-Socket

    這篇文章主要介紹了C++中簡單使用HP-Socket,HP-Socket 是一套通用的高性能 TCP/UDP /HTTP 通信 框架 ,包含服務端組件、客戶端組件和 Agent 組件,廣泛適用于各種不同應用場景的 TCP/UDP /HTTP 通信系統(tǒng),下面來看看更具體的介紹吧
    2021-11-11
  • 打印菱形以及斐波納契數(shù)列的幾種解法介紹

    打印菱形以及斐波納契數(shù)列的幾種解法介紹

    本篇文章是對打印菱形及斐波納契數(shù)列的幾種解法進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • C++如何實現(xiàn)定長內(nèi)存池詳解

    C++如何實現(xiàn)定長內(nèi)存池詳解

    內(nèi)存池根據(jù)存儲的元素的長度是否可變,分為變長,與定長兩種內(nèi)存池,這篇文章主要給大家介紹了關于C++如何實現(xiàn)定長內(nèi)存池的相關資料,需要的朋友可以參考下
    2021-09-09
  • C語言深入回顧講解結構體對齊

    C語言深入回顧講解結構體對齊

    C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結構是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項,本篇讓我們來了解C 的結構體內(nèi)存對齊
    2022-06-06
  • Qt Quick Designer灰色或者禁用的解決

    Qt Quick Designer灰色或者禁用的解決

    本文主要介紹了Qt Quick Designer灰色或者禁用的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • 手把手教你實現(xiàn)一個C++單鏈表

    手把手教你實現(xiàn)一個C++單鏈表

    鏈表是一種數(shù)據(jù)結構,用于數(shù)據(jù)的存儲。這篇文章主要為大家介紹了如何實現(xiàn)一個C++單鏈表,文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下
    2022-11-11

最新評論