1、set基本特点:
set集合容器实现了红黑树(Red-BlackTree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值;另外,还得确保根节点的左子树的高度与有字数的高度相等,这样,二叉树的高度最小,从而检索速度最快。要注意的是,它不会重复插入相同键值的元素,而采取忽略处理。
平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。
2、set基本操作:
#include<set>
#include<iostream>
#include<string>
using namespace std;
//自定义比较函数,如果不定义,则默认从小到大排列
struct mycomp {
bool operator()(const int &a, const int &b) {
return a > b;
}
};
//如果元素是结构体,可以直接把比较函数写在结构体中
struct Info {
string name;
int score;
bool operator < (const Info &a) const {
return a.score < score;
}
};
int main()
{
//set构造方法
set<int> s1;//方法一
int d[] = { 1,4,4,3,6,8 };
set<int> s2(d, d + 5);//方法二
set<int> s3(s2.begin(), s2.end());//方法三
//set插入方法
s1.insert(1);
s1.insert(5);
s1.insert(7);
s1.insert(3);
s1.insert(5);//重复,不插入
//set遍历
set<int>::iterator it = s2.begin();
for (it; it != s2.end(); it++) {
cout << *it;
}
cout << endl;
//set反向遍历,reverse_iterator配合rbegin、rend
set<int>::reverse_iterator rit = s2.rbegin();
for (rit; rit != s2.rend(); rit++) {
cout << *rit;
}
cout << endl;
//set删除
it = s3.begin();
for (int i = 0; i < 2; i++)
it = s3.erase(it);
for (it = s3.begin(); it != s3.end(); it++)
cout << *it << " ";
cout << endl;
s3.clear();//清空数据
cout << s3.size() << endl;
//元素检索
it = s2.find(5);
if (it != s2.end()) {
cout << "find elem 5" << endl;
}
else {
cout << "not find elem 5" << endl;
}
//通过count方法判断
if (s2.count(6)) {
cout << "find elem 6" << endl;
}
else {
cout << "not find elem 6" << endl;
}
//自定义比较函数
int d2[] = { 2,8,3,9,1 };
set<int, mycomp> s4;
s4.insert(1);
s4.insert(5);
s4.insert(7);
s4.insert(3);
set<int, mycomp>::iterator it4 = s4.begin();
for (it4; it4 != s4.end(); it4++) {
cout << *it4;
}
cout << endl;
//自定义结构体
set<Info> s;
Info info;
info.name = "Jack";
info.score = 80;
s.insert(info);
info.name = "Tom";
info.score = 99;
s.insert(info);
info.name = "Steaven";
info.score = 60;
s.insert(info);
set<Info>::iterator it5 = s.begin();
for (it5; it5 != s.end(); it5++) {
cout << (*it5).name << " : " << (*it5).score << endl;
}
return 0;
}
Set常用函数:跟其他容器的函数差不多
begin()--返回指向第一个元素的迭代器
clear()--清除所有元素
count()--返回某个值元素的个数
empty()--如果集合为空,返回true
end()--返回指向最后一个元素的迭代器
equal_range()--返回集合中与给定值相等的上下限的两个迭代器
erase()--删除集合中的元素
find()--返回一个指向被查找到元素的迭代器
get_allocator()--返回集合的分配器
insert()--在集合中插入元素
:lower_bound()--返回指向大于(或等于)某值的第一个元素的迭
key_comp()--返回一个用于元素间值比较的函数
max_size()--返回集合能容纳的元素的最大限值
rbegin()--返回指向集合中最后一个元素的反向迭代器
rend()--返回指向集合中第一个元素的反向迭代器
size()--集合中元素的数目
swap()--交换两个集合变量
upper_bound()--返回大于某个值元素的迭代器
value_comp()--返回一个用于比较元素间的值的函数