一、使用前提

引入头文件:

#include <unordered_set>

二、unordered_set是什么

unordered_set 容器,可直译为“无序 set 容器”。即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。

unordered_set的几个特性:

  • 不再以键值对的形式存储数据,而是直接存储数据的值 ;
  • 容器内部存储的各个元素的值都互不相等,且不能被修改;
  • 不会对内部存储的数据进行排序

三、unordered_set的初始化
创建空的set

unordered_set set1;

拷贝构造

unordered_set set2(set1);

使用迭代器构造

unordered_set set3(set1.begin(), set1.end());

使用数组作为其初值进行构造

unordered_set set4(arr,arr+5);

移动构造

unordered_set set5(move(set2));

使用处置列表进行构造

unordered_set set6 {1,2,10,10};

示例代码

#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;

int main()
{
    // 创建一个空的unordered_set容器
    std::unordered_set<int> uset;
    // 给 uset 容器添加数据
    uset.emplace(1);
    uset.emplace(5);
    uset.emplace(7);
    uset.emplace(7);
    // 查看当前 uset 容器存储元素的个数
    cout << "uset size = " << uset.size() << endl;
    // 遍历输出 uset 容器存储的所有元素
    for (auto iter = uset.begin(); iter != uset.end(); ++iter)
    {
        cout << *iter << endl;
    }
    return 0;
}

输出

huifeimao@CN-SHA-0132:~/Desktop/work/c++_project/LeetCode$ g++ unordered_set使用方法.cpp -o main
huifeimao@CN-SHA-0132:~/Desktop/work/c++_project/LeetCode$ ./main
uset size = 3
7
5
1

说明emplace插入数据是插入到开头的。
在C++中,emplaceemplace_back是用于在容器中插入元素的成员函数。它们的主要区别取决于容器的类型。

  1. emplace函数用于关联容器和无序容器(如unordered_setunordered_map等)。它接受参数并在容器中构造新的元素,而不需要拷贝或移动操作。这是通过在容器中直接构造元素而不是创建临时对象,然后再将其插入容器中来实现的。这样可以避免不必要的拷贝或移动操作,从而提高性能。

示例代码:

std::unordered_set<int> mySet;
mySet.emplace(42);  // 使用 emplace 插入元素
  1. emplace_back函数用于顺序容器(如vectordeque等),它只能在容器的尾部插入元素。它也接受参数并在容器中构造新的元素,但与emplace不同的是,它只能在容器的尾部插入元素,因为顺序容器是按顺序存储元素的。emplace_back会在容器的末尾就地构造元素,而无需创建临时对象。

示例代码:

std::vector<int> myVector;
myVector.emplace_back(42);  // 使用 emplace_back 在容器尾部插入元素

总之,emplaceemplace_back函数都是在容器中就地构造新元素的方法。emplace用于关联容器和无序容器,emplace_back用于顺序容器,并且只能在尾部插入元素。它们在避免不必要的拷贝或移动操作方面提供了性能上的好处。