C++ set新增、刪除和存取(STL set新增、刪除和存取)元素詳解

2020-07-16 10:04:28
set 中沒有實現成員函數 at(),也沒有實現 operator[]() 。除了這些操作外,set 容器提供 map 容器所提供的大部分操作。可以使用 insert()、emplace()、emplace_hint() 成員函數來向 set 中新增元素。

新增元素

下面是一個使用 insert() 的範例:
std::set<string, std::greater<string>> words {"one", "two", "three"};
auto pr1 = words.insert("four");
auto pr2 = words.insert ("two") ;
auto iter3 = words.insert(pr.first, "seven");
words.insert ({ "five","six"}) ;
string wrds[] {"eight", "nine", "ten"};
words.insert(std::begin(wrds) , std::end(wrds));
插入單個元素會返回一個 pair<iterator,bool> 物件。插入單個元素和一個標識,會返回一個疊代器。插入一段元素或一個初始化列表就不會有返回值。當 insert() 的引數是初始化列表時,會用列表中的字串建立 string 物件。下面是兩個在 set 容器中建立元素的範例:
std::set<std::pair<string,string>> names;
auto pr = names.emplace("Lisa", "Carr");
auto iter = names.emplace_hint(pr.first, "Joe", "King");
這和 map 一樣。成員函數 emplace() 會返回一個 pair<iterator,bool> 物件,而 emplace_hint() 只返回一個疊代器。前者的引數被直接傳入元素的建構函式,用來建立元素。emplace_hint() 的第一個引數是一個疊代器,它指出了元素可能的插入位置,隨後的引數會被傳入元素的建構函式。

刪除元素

成員函數 clear() 會刪除 set 的所有元素。成員函數 erase() 會刪除疊代器指定位置的元素或與物件匹配的元素。例如:
std::set<int> numbers {2, 4, 6, 8, 10, 12, 14};
auto iter = numbers.erase(++std::begin(numbers));
auto n = numbers.erase(12);
n = numbers.erase(13);
numbers.clear();
成員函數 erase() 可以刪除一段元素:
std::set<int> numbers {2, 4, 6, 8, 10, 12, 14};
auto iter1 = std::begin(numbers); // iter1 points to 1st element
advance(iterl, 5); // Points to 6th element-12
auto iter = numbers.erase(++std:rbegin(numbers), iter1);// Remove 2nd to 5th inclusive. iter points to 12
如果 set 沒有元素,成員函數 empty() 返回 true,成員函數 size() 返回它所包含的元素個數。如果擔心無法在 set 中儲存盡可能多的元素,可以呼叫成員函數 max_size() 來得到可儲存的最大元素個數,這顯然會是一個很大的值。

存取元素

set 的成員函數 find() 會返回一個和引數匹配的元素的疊代器。如果物件不在 set 中,會返回一個結束疊代器。例如:
std::set<string> words {"one", "two","three", "four","five"};
auto iter = words.find ("one") ; // iter points to "one"
iter = words.find(string{"two"});   // iter points to "two"
iter = words.find ("six");   // iter is std:: end (words)
呼叫成員函數 count() 可以返回指定鍵所對應的元素個數,返回值通常是 0 或 1,因為 set 容器中的元素是唯一的。set 容器模板定義了成員函數 equal_range()、lower_bound()、 upper_bound(),這和 multiset 容器在很大程度上是一致的。