set與map用法簡介

2021-07-24 14:01:49 字數 3852 閱讀 9435

在介紹容器之前,我們先來介紹一下pair,pair是一種模板型別,每個pair可以儲存兩個值,這兩個值的型別可以是任何型別的。它定義在#include中。

可以看到,pair的兩個成員分別是first和second。

一、set(集合):

set是一種key結構,它的元素就是它的鍵值,set不允許有兩個相同的鍵值,set中的所有元素的鍵值都會自動被排序。set和multiset都包含在#include中。set和multiset的底層都是用紅黑樹實現的,不過set的底層插入機制是insert_unique,multiset的底層插入機制是insert_equal。

template,class allocator>

set也是一種模板,它的第乙個模板引數是鍵值的型別。第二個引數是乙個仿函式,它傳入了鍵值的比較方式,決定是公升序排序還是降序排序。第三個引數是空間配置器。

set的常用操作:

1、insert

1.1、pairinsert(const value_type& x)

其中value_type是鍵值的型別,他會返回乙個pair型別的物件,其中pair的second如果為true的話就表示插入成功,否則就表示元素已經存在。

first是乙個指向要插入位置的迭代器。如果second是false,則frist就是已經存在的元素的這個位置的迭代器,如果second為true,first就是插入位置的迭代器。

1.2、iterator insert(iterator position,const valut_type& val)

position是乙個迭代器的位置,val表示要插入的數。如果插入成功,則會返回乙個新插入元素位置的迭代器。否則的話返回這個傳入的迭代器。

1.3、template

void insert(

inputiterator first,

inputiterator last

)插入一段迭代器區間

2、erase

2.1、void erase(iterator position)

刪除乙個迭代器位置。

2.2、size_type erase(const value_type& val)

如果刪除成功的話就返回1,否則返回0。

2.3、void erase(iterator first,iterator last)

刪除一段迭代器區間。

3、find

iterator find(const value_type& val) const;

如果找到的話就返回這個位置的迭代器,否則就返回end。

4、count

size_type count(const value_type& val) const;

統計鍵值出現的次數,由於set裡面不允許有重複出現的鍵值,所以count的返回結果就只有0和1兩個結果,0就表示不存在,1表示存在。有木有感覺set中的count與empty的功能重複了,其實count在multiset中的作用比較大,但是為了統一stl中容器的介面,所以在set中也增加了count。

set的迭代器set::iterator是一種const_iterator,所以不允許通過迭代器修改set中的值。

multiset:

multiset的特性和用法和set的用法完全相同,唯一的差別就是它允許鍵值重複出現。下面可以下他們的不同之處:

1、insert

iterator insert(const value_type& val)如果直接插入乙個鍵值的話,在multiset中返回的是插入元素位置的迭代器。

2、count

multiset中可以出現重複的鍵值。count統計的是相同鍵值出現的次數。如果count的結果為0則表示沒有出現,如果不為0則表示出現的次數 。

二、map(對映):

map是一種key(鍵)、value(值)形式,用於儲存鍵和值組成的條目集合。它要求鍵值必須是唯一的,值可以不唯一,同乙個值可以對映到多個鍵上。所有的元素都會根據鍵值自動排序。map中的所有元素都是pair,同時擁有鍵值(key)和實值(value),pair的first被視為鍵值,second被當做實值,但不允許有相同的鍵值。map的底層是用紅黑樹實現的,它的insert機制是一種insert_unique()。我們不可以通過迭代器修改元素的鍵值,但是可以通過迭代器修改元素的實值。

template,class alloc=allocator> >

map也是乙個模板,他有四個模板引數型別,第乙個是鍵值的型別。第二個是實值的型別。第三個是乙個仿函式,它傳入的是鍵值的比較方式,預設是公升序排列。第四個是空間配置器。

map的每個元素都是pair型別。

typedef pairvalue_type;

1、insert

1.1、pairinsert(const value_type& val);

插入乙個value_type型別,返回值是乙個pair型別。   pair=pair::iterator,bool>。

如果插入成功的話則bool就為true,且iterator指向插入的位置,否則的話iterator就指向已經存在的這個元素的位置。

iterator是乙個pair型別的迭代器。

1.2、iterator insert(iterator,const value_type& val)

在乙個迭代器的位置插入乙個value_type型別的資料,如果插入成功的話返回這個成功位置的迭代器,如果失敗的話則返回這個傳入的迭代器。

1.3、template

void insert(inputiterator first,inputiterator last);

插入一段迭代器區間

2、erase

2.1、void erase(iterator position)

刪除乙個這個迭代器位置的元素。

2.2、size_type erase(const key_type& k)

刪除這個鍵值所在的位置,成功返回1,失敗返回0

2.3、void erase(iterator first,iterator last);

刪除一段迭代器區間。

3、find

iterator find(const key_type& k)

如果查詢成功的話則返回這個元素的迭代器,否則返回end,所以在使用find返回的迭代器之前要先判斷一下。

4、count

size_type count(const key_type& k)const

map中的count與set的count功能一樣。

5、operator

map中的operator是最常用的,如果map中有這個k,則它就把這個k所對應的value的引用返回。如果map中沒有這個k的話,則它會呼叫insert(pair(k,v())),將k和v的預設值對應起來插入進去,並返回這個value的引用。

multimap:

multimap與map的特性及用法完全相同,唯一的差別是multimap允許鍵值重複。multimap包含在#include中,它的底層是用紅黑樹實現的,它的insert機制是insert_equal。它的count與multiset的count的用法及作用完全一樣。下面看一下他們的不同:

1、insert

iterator insert(const value_type& val)

如果插入乙個map的元素的話,multimap會返回乙個這個插入位置的迭代器。

2、count

count與multiset的count完全相同,multimap中的count統計的是鍵值出現的次數。

3、multimap中沒有operator,這個很好理解,當你呼叫operator的時候會對應多個結果,返回哪個都不合適,所以也就沒有operator。

map 與 set 簡單用法

map 與 set 簡單用法 map set 用於查詢時用set 一 map 在map中元素有兩種插入方法 在map中使用下標訪問不存在的元素將導致在map容器中新增乙個新的元素。insert函式的插入方法主要有如下 上述的e乙個value type型別的值。beg和end標記的是迭代器的開始和結束...

c 中set與map用法詳解

c stl之所以得到廣泛讚譽,也被很多人使用,不只是提供了向vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和常用的資料結構操作。vector封裝了陣列,list封裝了鍊錶,map和set封裝了二叉樹等。在封裝這些資料結構的時候,stl按照程式設計師的...

C 中set用法簡介

c stl 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了鍊錶,map和set封裝了二叉樹等,在封裝這些資料結構的時候,stl按照程式設計...