STL 容器

1.5 集合set

提供对数时间的插入、删除、查找的集合数据结构。底层原理是红黑树。

集合三要素解释setmultisetunordered_set
确定性一个元素要么在集合中,要么不在
互异性一个元素仅可以在集合中出现一次❌(任意次)
无序性集合中的元素是没有顺序的❌(从小到大)❌(从小到大)

1.5.1 常用操作

  • 函数构造 set<类型,比较器>

  • 插入元素 st.insert(元素)

  • 删除元素 st.erase(元素)

  • 查找元素 st.find(元素)

  • 查找元素个数 st.count

1.5.2 遍历

可以使用遍历器来遍历set数据:

set<int> st;
for (set<int>::iterator it = st.begin() ; it != st.end();++it )
{
    cout << *it <<endl;
}

基于范围的循环:

for(auto &ele : st)
{
    cout << ele << endl;
}

1.5.3适用范围

  • 元素的去重 [1,1,2,3,3,5,7] [1,2,3,5,7]
  • 元素顺序的维护 [1,6,8,4,1] [1,4,6,8]
  • 元素大小很大但数量很少的情况(大小:[10^18^,10^18^],数量10^6^)

1.5.4 注意事项

  • set数据不存在下标的说法,但可以用遍历器找数据:
set<int>::iterator it = st.begin();
advance(it,2); //迭代器后面会讲
cout << *it <<endl;
  • 元素都是只读的,set迭代器提取的元素都是只读的(因为是const迭代器),不能够修改它的值,需要先erase再inset
cout << *st.begin() <<endl; //正确
*st.begin() = 1; //错误,不可写
  • 不可用迭代器计算下标

set 的迭代器不能像 vector 一样相减得到下标。下面是错误用法:

auto it = st.find(2);      // 正确,返回2所在位置的迭代器。
int idx = it - st.begin(); // 错误!不可相减得到下标。