C++ unordered_set插入元素(insert插入元素)詳解

2020-07-16 10:04:32
成員函數 insert() 可以插入作為引數傳入的單個元素。在這種情況下,它會返回一個 pair 物件,這個 pair 物件包含一個疊代器,以及一個附加的布林值用來說明插入是否成功。如果元素被插入,返回的疊代器會指向新元素;如果沒有被插入,疊代器指向阻止插入的元素。可以用一個疊代器作為 insert() 的第一個引數,它指定了元素被插入的位置,如果忽略插入位置,在這種情況下,只會返回一個疊代器。另一個版本的 insert() 函數可以插入初始化表中的元素,在這種情況下,什麼都沒有返回。

下面是一些說明性語句:
auto pr = words.insert("ninety"); // Returns a pair - an iterator & a bool value
auto iter = words.insert (pr.first, "nine"); // 1st arg is a hint. Returns an iterator
words.insert({"ten", "seven", "six"});  // Inserting an initializer list
當呼叫 insert() 插入一段元素時,什麼都不返回:
std::vector<string> more { "twenty", "thirty", "forty" };
words.insert(std::begin(more), std::end(more));//Insert elements from the vector
unordered_set 容器的成員函數 emplace() 和 emplace_hint() 可以在容器的適當位置建立元素。正如我們之前所見的 set 容器,傳入 emplace() 的引數會被傳入元素的建構函式,用來建立元素。emplace_hint() 的疊代器引數可以指定元素的插入位置,後面是構造元素需要的引數。例如:
std::unordered_set<std::pair<string, string>, Hash_pair> names;
auto pr = names.emplace ("Jack", "Jones") ; // Returns pair<iterator, bool>
auto iter = names.emplace_hint (pr.first, "John", "Smith"); // Returns an iterator
容器的元素是用來表示名稱的 pair 物件,這裡的每個名稱由兩個 string 物件組成,它們分別表示一個人的姓和名。unordered_set<T> 元素預設的雜湊函數是一個 hash<T> 類別範本的範例。這個模板對基本型別、指標、string 物件有一些特例化的定義。

因為沒有 hash<pair<string,string>> 模板的特性化定義,所以需要定義一個雜湊函數來雜湊元素。這裡將它的型別指定為 -Hash_pair,它也是模板的第二個型別引數。emplace() 的姓名引數會被傳入 pair 的建構函式中,emplace_hint() 使用了一個指向先前插入元素的疊代器,這一點可能會被忽略。後面的引數是 pair 建構函式的引數。函數物件型別 Hash_pair 可以用來對 names 容器中的元素進行雜湊,可以按如下方式定義它:
class Hash_pair
{
public:
    size_t operator()(const std::pair<string, string>& pr)
    {
        return std::hash<string>()(pr.first + pr.second);
    }
};
這裡使用了一個定義在 string 標頭檔案中的 hash<string> 函數物件的範例。它會雜湊一個由 pair 物件的第一個成員和第二個成員串聯的字串,然後將結果作為這個 pair 元素的雜湊值返回。