C++ unordered_set emplace详解
在C++中,unordered_set是一种无序的集合容器,它存储不重复的元素,并且提供了高效的查找、插入和删除操作。emplace函数是unordered_set中用于插入元素的一种方式,它与insert函数类似,但是更加高效。本文将详细解释unordered_set和emplace函数的使用方法,并且给出示例代码。
unordered_set简介
unordered_set是STL标准库中的一种集合容器,它内部使用哈希表来存储元素,因此插入、查找和删除操作的时间复杂度均为O(1)。unordered_set中的元素是不重复的,每个元素在集合中只会出现一次。与set相比,unordered_set不会对元素进行排序,在插入或删除元素时更加高效。
unordered_set的定义方式如下:
#include <unordered_set>
std::unordered_set<int> mySet;
emplace函数概述
emplace函数是C++11标准引入的新特性,用于在容器中构造元素,不需要拷贝或移动元素。对于unordered_set来说,emplace函数用于插入新的元素,并且返回一个pair类型的值,表示插入的结果。如果插入成功,则pair的第一个元素为一个迭代器,指向插入的元素;如果插入失败(因为元素已经存在),则pair的第一个元素为一个迭代器,指向已经存在的元素。
emplace函数的定义方式如下:
template <class... Args>
std::pair<iterator, bool> emplace(Args&&... args);
使用emplace插入元素
下面我们来看一个示例,演示如何使用emplace函数向unordered_set中插入元素:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<std::string> mySet;
auto result1 = mySet.emplace("apple");
if(result1.second) {
std::cout << "Inserted: " << *(result1.first) << std::endl;
}
auto result2 = mySet.emplace("apple");
if(!result2.second) {
std::cout << "Element already exists: " << *(result2.first) << std::endl;
}
return 0;
}
在上面的示例中,我们首先创建了一个空的unordered_set容器mySet,然后使用emplace函数插入了一个字符串”apple”。第一次插入成功,因为”apple”是一个新的元素,插入的结果存储在result1中,我们通过result1.second来判断插入是否成功,并且通过result1.first得到插入的元素的迭代器。第二次插入失败,因为unordered_set中已经存在”apple”这个元素,插入的结果存储在result2中,我们通过result2.second来判断插入是否成功,并且通过result2.first得到已经存在的元素的迭代器。
运行结果如下:
Inserted: apple
Element already exists: apple
unordered_set的遍历
对于unordered_set容器,可以使用迭代器来遍历集合中的元素。下面是一个示例,演示如何使用迭代器来遍历unordered_set:
#include <iostream>
#include <unordered_set>
int main() {
std::unordered_set<int> mySet = {1, 2, 3, 4, 5};
for(auto it = mySet.begin(); it != mySet.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
在上面的示例中,我们首先创建了一个包含5个整数的unordered_set容器mySet,然后使用迭代器从头到尾遍历容器中的元素,并输出每个元素的值。
运行结果如下:
1 2 3 4 5
总结
本文详细介绍了C++中unordered_set容器的概念和emplace函数的用法。unordered_set是一种高效的集合容器,用于存储不重复的元素。emplace函数可以高效地插入元素,并且返回插入的结果。