STL 容器(二) set和map簡單了解

2021-09-26 18:30:15 字數 2172 閱讀 1093

set是我們所說的單重集合。set是一類資料的集合,乙個有序集合,也就是說它裡邊的元素都是排好序的,並且set不允許插入的元素重複。set支援插入刪除查詢等操作,它的所有操作都能在(logn)的時間複雜度內完成,效率很高。multiset與set的區別就在於,multiset允許插入的元素重複。

set的預設排序準則是less,當然我們也可以去定義其他的排序準則。

1.template引數定義之:

std::set> coll;

這種情況下,排序準則是是型別的一部分,這是排序準則的通常指定用法,如果排序準則不相同,則不能相互比較。

2.以構造函式引數定義之:

這種情況下,同乙個型別可以運用不同的排序準則,而排序準則的初始值或狀態可以不同。如果執行期間才獲得排序準則,而且需要用到不同的排序準則,以構造函式引數定義的方式則派上用場了。

count(elem): 返回「元素值為elem」的元素個數

find(elem):返回「元素值為elem」的第乙個元素,如果找不到就返回end()

lower_bound(elem):返回elem的第乙個可安插位置,也就是「元素值》=elem」的第乙個位置

upper_bound(elem)):返回elem的最後乙個可安插位置,也就是「元素值》elem」的第乙個位置

equal_range(elem):返回elem可安插的第乙個位置和最後乙個位置,即equal_range()將lower_bound()和upper_bound()的  返回值做個乙個pair返回。

**:

int main()

myset.insert(-1);

myset.insert(8);//插入失敗,不允許鍵值重複

auto tmp = myset.find(9);

auto it = myset.erase(0);//刪除0號下標的元素,返回值是下乙個元素的迭代器

myset.erase(8);

刪除該區間的所有元素,返回以乙個元素的迭代器

myset.swap(ss);//交換兩個集合容器

multisetmymuset;//多重集合

for(int i = 0;i < 10;++i)

mymuset.insert(9);//允許鍵值重複

mymuset.erase(7);

mymuset.erase(mymuset.begin(),mymuset.end());//刪除區間內的所有資料

二、map和multimap

map是單對映,multimap是多對映。它們是我們的對映容器,的對映。map的所有元素都是pair(組),同時擁有實值和鍵值,pair的第一元素被視為是鍵值,第二元素被視為是實值;map不允許兩個元素有相同的鍵值。我們也不能通過map的迭代器改變map的鍵值,因為map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。但是可以修改元素的實值。

map和list擁有相同的某些性質,當對它的容器元素進行增刪操作時,操作之前的所有迭代器,在操作完成之後依然有效,當然被刪除的那個元素的迭代器必然是個例外。

multimap和map的操作類似,唯一區別multimap鍵值可重複。

它們底層都是以紅黑樹實現的。

(摘抄於:

C 學習筆記 STL常用容器 set和map

set 所有元素在插入時自動排序,底層結構用二叉樹實現。set和multiset的區別 set不允許容器中有重複的元素,multiset允許容器中有重複的元素。set構造和賦值 構造 預設建構函式 setst 拷貝建構函式 set const set st 賦值 過載等號操作符 set operat...

set容器 map容器

簡介 本質 set和multiset區別 構造 賦值 include void printset set int s cout endl 構造和賦值 void test01 intmain 總結 函式原型 include void printset set int s cout endl 大小 vo...

STL之map容器和multimap容器

所有元素都會根據元素的鍵值自動排序。map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值。map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。如果想要修改元素的實值,那麼是可以的。map和l...