日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

STL--set容器的使用詳解 插入、刪除

 木三水0vosidma 2019-05-06

set容器的使用詳解

其實(shí)map和set是一個(gè)爸爸 - 紅黑樹爸爸,只不過(guò)set力氣不夠,不像map那么可以擁有一個(gè)主鍵(key)和實(shí)鍵(value).它只有一個(gè)鍵值并且


set當(dāng)中不能存儲(chǔ)相同的鍵值(set還具有強(qiáng)迫癥). 其實(shí)map和set的區(qū)別差不多就完了. 他們的相同點(diǎn),他們底層都是使用紅黑樹構(gòu)造的


這使得他們的查找,插入,刪除的效率都非常的高. 并且他們都是有序的,這些都非常關(guān)鍵! 這是一個(gè)好的容器的標(biāo)準(zhǔn).當(dāng)然set的禁忌


也和map一樣,set不能存儲(chǔ)無(wú)法比較大小的數(shù)據(jù). 因?yàn)闃?gòu)建紅黑樹需要比較大小. 而且在set中存儲(chǔ)相同的鍵值 ,新的就會(huì)覆蓋久的.


set的特性是,所有元素都會(huì)根據(jù)元素的鍵值自動(dòng)被排序. 我們可以通過(guò)set的迭代器改變set的元素值嗎? 不行,因?yàn)閟et元素值就是其鍵


值,關(guān)系到set元素的排列規(guī)則,如果任意改變set元素值,會(huì)嚴(yán)重破壞set組織. set的源代碼之中看到,set<T>::iterator被定義為底層RB_


tree的const_iterator,杜絕寫入操作. 換句話說(shuō),set iterator是一種constant iterator(相對(duì)于mutable iterator).


set擁有與list相同的某些性質(zhì): 當(dāng)客戶端對(duì)它進(jìn)行元素新增操作或刪除操作時(shí),操作之前的所有迭代器,在操作完成之后都依然有效,當(dāng)然


那個(gè)被刪除元素迭代器必然是個(gè)例外.



set相關(guān)函數(shù)



 

begin 返回一個(gè)迭代器,此迭代器指向set中的第一個(gè)元素。

cbegin 返回一個(gè)常量迭代器,此迭代器指向set中的第一個(gè)元素。

cend 返回一個(gè)迭代器,此迭代器指向set最后一個(gè)元素的下一個(gè)位置

clear 清除set的所有元素。

crbegin 返回一個(gè)常量迭代器,此迭代器指向反向set中的第一個(gè)元素。

crbegin 返回一個(gè)常量迭代器,此迭代器指向反向set中的第一個(gè)元素。

crend 返回一個(gè)常量迭代器,此迭代器指向反向set中最后一個(gè)元素之后的位置。

emplace 將就地構(gòu)造的元素插入到set。

emplace_hint 將就地構(gòu)造的元素插入到set,附帶位置提示。

empty 如果set為空,則返回 true。

end 返回一個(gè)迭代器,此迭代器指向set最后一個(gè)元素的下一個(gè)位置

erase 從指定位置移除set中的元素或元素范圍。

   

find 返回一個(gè)迭代器,此迭代器指向set中其鍵與指定鍵相等的元素的位置。

get_allocator 返回集合中與給定值相等的上下限的兩個(gè)迭代器.

insert 將元素或元素范圍插入到set中的指定位置。

key_comp 將返回一個(gè)用于元素鍵值比較的函數(shù)

lower_bound 返回一個(gè)迭代器,此迭代器指向set中其鍵值等于或大于指定鍵的鍵值的第一個(gè)元素。

max_size 返回set的最大長(zhǎng)度。

rbegin 返回一個(gè)迭代器,此迭代器指向反向set中的第一個(gè)元素。

rend 返回一個(gè)迭代器,此迭代器指向反向set中最后一個(gè)元素之后的位置。

size 返回set中的元素?cái)?shù)量。

swap 交換兩個(gè)set的元素。

upper_bound 返回一個(gè)迭代器,此迭代器指向set中其鍵值大于指定鍵的鍵值的第一個(gè)元素。

   

   

   


訪問(wèn)操作:


這里我們需要掌握的函數(shù)有:begin,end,find,cbegin,cend.rbegin,rend,empty 


因?yàn)檫@里的rbegin,rend,cbegin.cend用法和begin和end用法相同,所以我們這里使用begin作為示范.


插入操作:


 set<int> T;

 

 

 //***1*** 最普通的插入方式

 T.insert(2);

 T.insert(3);

 T.insert(4);

 T.insert(5);

 T.insert(6);

 //插入元素

 

 cout << "遍歷T的元素: " << " ";

 set<int>::iterator it1 = T.begin();

 

 while (it1 != T.end())

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***2*** 利用數(shù)組集合插入

 set<int> OtherSet;

 int arr[10] = { 1, 2, 3, 4, 5 };

 OtherSet.insert(arr, arr + 3);

 

 cout << "遍歷OtherSet的元素: " << " ";

 it1 = OtherSet.begin();

 

 while (it1 != OtherSet.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***3*** 利用迭代器區(qū)間進(jìn)行插入

 

 set<int> OtherSet2;

 

 OtherSet2.insert(T.begin(), T.end());

 

 cout << "遍歷OtherSet的元素: " << " ";

 it1 = OtherSet2.begin();

 

 while (it1 != OtherSet2.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;



運(yùn)行結(jié)果:




刪除操作:



代碼演示:


 set<int> T;

 int arr[10] = { 1, 2, 3, 4, 6, 7 };

 

 T.insert(arr, arr + 6);

 

 cout << "遍歷T的元素: " << " ";

 set<int>::iterator it1 = T.begin();

 

 while (it1 != T.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 

 //***1*** 找到節(jié)點(diǎn)迭代器然后刪除節(jié)點(diǎn)

 

 set<int>::iterator it2 = T.find(2);

 //先找到鍵值為2的迭代器,然后刪除該迭代器.

 

 T.erase(it2);

 

 cout << "遍歷T的元素: " << " ";

 it1 = T.begin();

 

 while (it1 != T.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***2*** 刪除一個(gè)迭代器區(qū)間

 it2 = T.find(3);

 

 T.erase(it2, T.end());

 //刪除3到set結(jié)束這段區(qū)間的所有元素.

 

 cout << "遍歷T的元素: " << " ";

 it1 = T.begin();

 

 while (it1 != T.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;

 

 //***3*** 終極大招 clear

 

 T.clear();

 

 cout << "遍歷T的元素: " << " ";

 it1 = T.begin();

 

 while (it1 != T.end())

 

 {

  cout << *it1 << " ";

  ++it1;

 }

 cout << endl;


運(yùn)行結(jié)果:








    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多