1. 程式人生 > >STL — set容器的使用詳解

STL — set容器的使用詳解

set容器的使用詳解

其實map和set是一個爸爸 - 紅黑樹爸爸,只不過set力氣不夠,不像map那麼可以擁有一個主鍵(key)和實鍵(value).它只有一個鍵值並且set當中不能儲存相同的鍵值(set還具有強迫症).  其實map和set的區別差不多就完了. 他們的相同點,他們底層都是使用紅黑樹構造的這使得他們的查詢,插入,刪除的效率都非常的高. 並且他們都是有序的,這些都非常關鍵! 這是一個好的容器的標準.當然set的禁忌也和map一樣,set不能儲存無法比較大小的資料.  因為構建紅黑樹需要比較大小. 而且在set中儲存相同的鍵值 ,新的就會覆蓋久的.set的特性是,所有元素都會根據元素的鍵值自動被排序.  我們可以通過set的迭代器改變set的元素值嗎? 不行,因為set元素值就是其鍵
值,關係到set元素的排列規則,如果任意改變set元素值,會嚴重破壞set組織. set的原始碼之中看到,set<T>::iterator被定義為底層RB_tree的const_iterator,杜絕寫入操作. 換句話說,set iterator是一種constant iterator(相對於mutable iterator).set擁有與list相同的某些性質: 當客戶端對它進行元素新增操作或刪除操作時,操作之前的所有迭代器,在操作完成之後都依然有效,當然那個被刪除元素迭代器必然是個例外.set相關函式
begin返回一個迭代器,此迭代器指向set中的第一個元素。
cbegin返回一個常量迭代器,此迭代器指向set中的第一個元素。
cend返回一個迭代器,此迭代器指向set最後一個元素的下一個位置
clear清除set的所有元素。
crbegin返回一個常量迭代器,此迭代器指向反向set中的第一個元素。
crbegin返回一個常量迭代器,此迭代器指向反向set中的第一個元素。
crend返回一個常量迭代器,此迭代器指向反向set中最後一個元素之後的位置。
emplace將就地構造的元素插入到set。
emplace_hint將就地構造的元素插入到set,附帶位置提示。
empty如果set為空,則返回 true。
end返回一個迭代器,此迭代器指向set最後一個元素的下一個位置
erase從指定位置移除set中的元素或元素範圍。
find返回一個迭代器,此迭代器指向set中其鍵與指定鍵相等的元素的位置。
get_allocator返回集合中與給定值相等的上下限的兩個迭代器.
insert將元素或元素範圍插入到set中的指定位置。
key_comp將返回一個用於元素鍵值比較的函式
lower_bound返回一個迭代器,此迭代器指向set中其鍵值等於或大於指定鍵的鍵值的第一個元素。
max_size返回set的最大長度。
rbegin返回一個迭代器,此迭代器指向反向set中的第一個元素。
rend返回一個迭代器,此迭代器指向反向set中最後一個元素之後的位置。
size返回set中的元素數量。
swap交換兩個set的元素。
upper_bound返回一個迭代器,此迭代器指向set中其鍵值大於指定鍵的鍵值的第一個元素。

訪問操作:

這裡我們需要掌握的函式有:begin,end,find,cbegin,cend.rbegin,rend,empty 因為這裡的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*** 利用陣列集合插入
	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*** 利用迭代器區間進行插入

	set<int> OtherSet2;

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

	cout << "遍歷OtherSet的元素: " << " ";
	it1 = OtherSet2.begin();

	while (it1 != OtherSet2.end())

	{
		cout << *it1 << "  ";
		++it1;
	}
	cout << endl;


執行結果:

刪除操作:

程式碼演示:
	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***  找到節點迭代器然後刪除節點

	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*** 刪除一個迭代器區間
	
	it2 = T.find(3);

	T.erase(it2, T.end());
	//刪除3到set結束這段區間的所有元素.

	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;
	
執行結果:

相關推薦

STL List容器

List 容器 list是C++標準模版庫(STL,Standard Template Library)中的部分內容。實際上,list容器就是一個雙向連結串列,可以高效地進行插入刪除元素。 使用list容器之前必須加上<vector>標頭檔案:#inclu

C++ STL相關容器

vector: 一種隨機訪問的陣列型別,他提供了對陣列元素的快速、隨機訪問,以及在序列尾部快速、隨機的插入和刪除 操作。它在需要時可以改變其大小,也就是說大小可變的向量,比較靈活。可取代C++語言本身提供的傳統陣列。提 供隨機儲存能力。操作尾端元素的速度最快。由於所

STLset容器的使用

set容器的使用詳解其實map和set是一個爸爸 - 紅黑樹爸爸,只不過set力氣不夠,不像map那麼可以擁有一個主鍵(key)和實鍵(value).它只有一個鍵值並且set當中不能儲存相同的鍵值(se

STL之vector容器

vector 容器 vector是C++標準模版庫(STL,Standard Template Library)中的部分內容。之所以認為是一個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單的說:vector是一個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。 使用vector容器之前必須

STL 之 vector 容器

vector是C++標準模版庫(STL,Standard Template Library)中的部分內容。之所以認為是一個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單的說:vector是一個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。 使用vector容器之前必須加上標頭檔案:#include&

Docker 容器

docker duyuheng 容器 容器是 Docker 又一核心概念,簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解為模擬運行的一整套操作系統(提供了運行態環境和其他系統環境)和跑在上面的應用。本章將具體介紹如何來管理一個容器,包括創建、啟動和停止等。啟

Swoole Echo伺服器隨意搭建 及set函式

<?php //Server Class Server { private $serv; /** * 連結swoole伺服器 * Server constructor. */ public function __construct()

C++ LIST容器

STL之list容器詳解 List 容器 list是C++標準模版庫(STL,Standard Template Library)中的部分內容。實際上,list容器就是一個雙向連結串列,可以高效地進行插入刪除元素。 使用list容器之前必須加上<vector>標頭檔案:#in

C++容器

什麼是容器 首先,我們必須理解一下什麼是容器,在C++ 中容器被定義為:在資料儲存上,有一種物件型別,它可以持有其它物件或指向其它對像的指標,這種物件型別就叫做容器。很簡單,容器就是儲存其它物件的對 象,當然這是一個樸素的理解,這種“物件”還包含了一系列處理“其它物件”的方法,因為這些方法在程式

併發容器的原理,7大併發容器、及使用場景

併發容器的原理,7大併發容器詳解、及使用場景 http://youzhixueyuan.com/use-of-concurrent-containers.html 併發容器的由來 在Java併發程式設計中,經常聽到Java集合類,同步容器、併發容器,那麼他們有哪些具體分類,以及各自之間的

C++學習:list容器(一)

list容器詳解       首先說說STL         STL就是Standard Template Library,標準模板庫。這可能是一個歷史上最令人興奮的工具的最無聊

高併發之併發容器(從入門到超神)

一、ConcurrentHashMap 在上面已經提到過ConcurrentHashMap,ConcurrentHashMap相比Hashtable能夠進一步提高併發性,其原理圖如下: HashMap,Hashtable與ConcurrentHashMap都是

collection array hashMap list set ConcurrentHashMap

一、集合與陣列 陣列(可以儲存基本資料型別)是用來存現物件的一種容器,但是陣列的長度固定,不適合在物件數量未知的情況下使用。 集合(只能儲存物件,物件型別可以不一樣)的長度可變,可在多數情況下使用。 二、層次關係 Collection介面是集合類的根介

C++ STL string 用法

一、string的初始化 首先,為了在程式中使用string型別,必須包含標頭檔案 <string>。如下: #include <string> 注意這裡不是string.h,string.h是C字串標頭檔案。 string類是一個模板類

docker容器二:初識docker原理及命令

docker容器詳解二:初始docker原理及命令 docker原理 先來理解一下虛擬機器概念,廣義來說,虛擬機器是一種模擬系統,即在軟體層面上通過模擬硬體的輸入和輸出,讓虛擬機器的作業系統得以執行在

docker容器三:第一個docker程式

新建一個docker 下面來通過命令成功執行一個容器 通過docker images/image ls/docker list/等命令來檢視映象。 命令顯示的分別是: 映象名 標籤(在映象名

Java Set集合Set與List的區別

Java中的Set集合是繼承Collection的介面,是一個不包含重複元素的集合。     下圖是Set集合的原始碼。 Set和List都是以介面都形式來進行宣告。Set主要包含三種存放資料型別都變數,分別是HashSet,LinkedHashSet,TreeSet

STL—queue(佇列)

首先,在STL中queue&&stack其實並不叫容器(container),而是叫介面卡(adapter),他們是對容器的再封裝. 佇列queue: 佇列,簡稱對,是一種操作受限 的線

Spring-IOC容器

(最近在看spring,看到黑馬視訊教程裡面有些東西寫的還不錯,就稍微整合了一些,跟大家分享一下!    ) Spring作為一個在java界廣泛使用且評價頗高的一個開源框架,給我們提供了好多的功能,極大的方便了我們的開發。此處將介紹IOC容器和AOP概念。     IOC

STL中stack

stack Stacks are a type of container adaptor, specifically designed to operate in a LIFO context