set: “集合” 是一个内部自动有序,且不含重复元素
(1)访问 iterator
set不提供直接存取元素的任何操作函数,只能通过迭代器间接访问
(2)插入 insert
将元素插入set容器中,并自动递增排序和去重,时间复杂度为O(logN) ;N为set内元素的个数
(3)查找 find
find(value) 返回值对于为value的迭代器,时间复杂度为O(logN);N为set内元素的个数
(4)删除 erase
- 删除单个元素
set.erase(value);
set.erase(iterator);
- 删除某个区间的元素
set.erase(iterator1,iterator2);
另外值得一提是multiset
注意点:
(1)特性 和 用法与set完全相同
(2)唯一的差别是允许键值重复
采用的插入操作,为RB-Tree的insert-equal而非insert-unique
下面不废话了,直接上代码:
(简单的使用举例)
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> set1;
set<int>::iterator it;
int length=5;
for (size_t i = 0; i < length; i++)
{
set1.insert(i);
}
it = set1.begin();
cout << *it << endl;
// cout << *(it + 3) << endl; //error
set<int>::iterator it1= set1.find(3); //find return iterator
set<int>::iterator it2= set1.find(3);
cout << *it1 << endl;
cout << *it2 << endl;
set1.erase(it1, it2);
set1.erase(set1.find(1));
set1.erase(2);
int size = set1.size();
cout << size << endl;
set1.clear(); // clear all the set;
return 0;
}
注意:
(1)除开vector,string 之外的容器都不支持 *(iterator+i)的访问方式 // iterator 迭代器因此只能枚举
(2) set 中的元素实值就是键值,键值就是实值
因此不能通过迭代器来修改set内元素值,因为set 中的元素实值就是键值,关系到set元素的排列规则
(3)STL只规范复杂度与接口,并不规范是实现方法; 但是set大多以RB-Tree 实现为底层机制
RB-Tree有自动排序功能,而hashtable没有;
因此,hashset并没有自动排序的功能
(4)此外hashset和set的用法完全相同