下面是一些说明性语句:
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 元素的哈希值返回。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/21760.html