set容器的使用詳解 其實map和set是一個爸爸 - 紅黑樹爸爸,,只不過set力氣不夠,不像map那么可以擁有一個主鍵(key)和實鍵(value).它只有一個鍵值并且 set當中不能存儲相同的鍵值(set還具有強迫癥). 其實map和set的區(qū)別差不多就完了. 他們的相同點,,他們底層都是使用紅黑樹構造的 這使得他們的查找,,插入,刪除的效率都非常的高. 并且他們都是有序的,,這些都非常關鍵,! 這是一個好的容器的標準.當然set的禁忌 也和map一樣,set不能存儲無法比較大小的數(shù)據(jù). 因為構建紅黑樹需要比較大小. 而且在set中存儲相同的鍵值 ,,新的就會覆蓋久的. set的特性是,,所有元素都會根據(jù)元素的鍵值自動被排序. 我們可以通過set的迭代器改變set的元素值嗎? 不行,,因為set元素值就是其鍵 值,,關系到set元素的排列規(guī)則,如果任意改變set元素值,,會嚴重破壞set組織. set的源代碼之中看到,,set<T>::iterator被定義為底層RB_ tree的const_iterator,杜絕寫入操作. 換句話說,,set iterator是一種constant iterator(相對于mutable iterator). set擁有與list相同的某些性質: 當客戶端對它進行元素新增操作或刪除操作時,,操作之前的所有迭代器,在操作完成之后都依然有效,,當然 那個被刪除元素迭代器必然是個例外. set相關函數(shù)
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 將返回一個用于元素鍵值比較的函數(shù) lower_bound 返回一個迭代器,,此迭代器指向set中其鍵值等于或大于指定鍵的鍵值的第一個元素。 max_size 返回set的最大長度,。 rbegin 返回一個迭代器,,此迭代器指向反向set中的第一個元素。 rend 返回一個迭代器,,此迭代器指向反向set中最后一個元素之后的位置,。 size 返回set中的元素數(shù)量。 swap 交換兩個set的元素,。 upper_bound 返回一個迭代器,,此迭代器指向set中其鍵值大于指定鍵的鍵值的第一個元素。
訪問操作: 這里我們需要掌握的函數(shù)有: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*** 利用數(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ū)間進行插入
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*** 找到節(jié)點迭代器然后刪除節(jié)點
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*** 刪除一個迭代器區(qū)間
it2 = T.find(3);
T.erase(it2, T.end()); //刪除3到set結束這段區(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; 運行結果: |
|
來自: 木三水0vosidma > 《STL》