set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构。
唯一性:每个元素都是唯一的。如果你尝试插入一个已经存在的值,插入操作将失败(或被忽略),容器的大小不会改变。
有序性:内部使用平衡二叉搜索树(通常是红黑树)来实现。因此,元素会根据其值自动排序。默认情况下,元素按升序排列(使用 std::less<T>)。
键值一体:元素的值本身就是其排序的键。这与 std::map 不同,std::map 是键值对(key-value pair)。
不可变性:由于元素的值是排序的依据,一旦插入,就不能直接修改元素的值,否则会破坏容器的有序性。要“修改”一个元素,必须先删除旧元素,再插入新元素。
对数时间复杂度:大多数操作(如插入、删除、查找)的平均和最坏时间复杂度都是 O(log n),这得益于底层的平衡二叉树结构。
内存开销:相比于 std::vector 或 std::list,std::set 每个元素需要额外的指针来维护树结构,因此内存开销较大。
std::unordered_set 是 C++ 标准模板库(STL)中的一个关联容器,它存储唯一的元素,但不保证元素的顺序。
唯一性 :和 std::set 一样,std::unordered_set 中的每个元素都是唯一的。重复插入相同的值不会改变容器。
无序性:元素在容器中的存储顺序是无序的,由哈希函数决定,不反映元素值的大小关系。遍历时的顺序是不确定的。
键值一体:与 std::set 相同,元素的值本身就是其查找的键。
基于哈希表:使用哈希函数将元素映射到内部的“桶(bucket)”中。理想情况下,查找时间接近常数。
平均常数时间复杂度:
查找、插入、删除操作的平均时间复杂度为 O(1),
最坏情况为 O(n)(例如,所有元素都哈希到同一个桶中,发生严重冲突)。
内存开销:通常比 std::set 小,但哈希表可能有空桶,存在空间浪费。需要存储哈希值和处理冲突的结构。