介绍:
set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值;另外,还得确保根节点的左子树的高度与有字数的高度相等,这样,二叉树的高度最小,从而检索速度最快。要注意的是,它不会重复插入相同键值的元素,而采取忽略处理。
平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、和list的容器。另外,采用中序遍历算法可将键值由小到大遍历出来,所以,可以理解为平衡二叉检索树在插入元素时,就会自动将元素按键值从小到大的顺序排列。
Set容器和其他容器差不多,无非就是相同的值不存,存进去自动排序好了。
构造set集合的主要目的是为了快速检索
使用:
1、头文件
#include <set>
2、初始化
set<int> st; //声明一个int型set
set<int> st(tmp); //声明并用tmpset初始化vecset
set<int> tmp(st.begin(), st.begin() + 3); //用st set的第0个到第2个值初始化tmp
int arr[5] = {1, 2, 3, 4, 5};
set<int> st(arr, arr + 5); //将arr数组的元素用于初始化vec向量
//说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素,
//这个主要是为了和st.end()指针统一。
set<int> st(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值
3、基本操作
(1). 容量
大小:st.size();
最大容量: st.max_size();
判空: st.empty();
(2). 修改
插入元素: st.insert();
删除元素: st.erase();
清空元素: st.clear();
(3)迭代器
set<int>::iterator it;
开始指针:st.begin();
末尾指针:st.end(); //指向最后一个元素的下一个位置
反向迭代器
set<int>::reverse_iterator rit;
st.rbegin()、st.rend()
(5)查找
st.sfind(info);
4、例程
#include "stdafx.h"
#include <set>
#include <algorithm>
int main(int argc, char* argv[])
{
std::set<int> st; //声明一个int型set
int i;
printf("st.size() = %d\r\n", st.size());
printf("st.max_size() = %d\r\n", st.max_size());
printf("st.empty() = %d\r\n", st.empty());
st.insert(2);
st.insert(2);
st.insert(4);
st.insert(1);
st.insert(5);
st.insert(6);
st.insert(3);
std::set<int>::iterator it = st.begin();
printf("insert loop printf:\r\n");
for(; it != st.end(); it++)
{
printf("value = %d \r\n", *it);
}
it = st.begin();
it ++;
st.erase(it);
it = st.begin();
printf("erase loop printf:\r\n");
for(; it != st.end(); it++)
{
printf("value = %d \r\n", *it);
}
st.erase(6);
it = st.begin();
printf("erase loop printf:\r\n");
for(; it != st.end(); it++)
{
printf("value = %d \r\n", *it);
}
it = st.find(5);
if(it != st.end())
{
printf("find 5 succ \r\n");
}
else
{
printf("find 5 fail\r\n");
}
it = st.find(6);
if(it != st.end())
{
printf("find 6 succ \r\n");
}
else
{
printf("find 6 fail\r\n");
}
return 0;
}