set集合容器使用一种称为红黑树(Red-Black Tree) 的平衡二叉检索树的数据结构,来组织泛化的元素数据。每个节点包含一个取值红色或黑色的颜色域,以利于进行树的平衡处理。作为节点键值的元素的插入,必须确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值。不会将重复的键值插入容器,也不需要指定具体的插入位置,而按元素在树中的关联关系,进行位置检索和插入,元素的删除亦然。
元素数据的检索,使用的是二叉检索树的中序遍历算法,检索的效率高于vector、 deque和list等容器。由于采用中序遍历算法可将二叉检索树的键值,由小到大排列遍历出来,因此 set 集合容器蕴含了元素间的有序性。
作为一种关联容器,set 集合容器实现了 Unique Sorted Associative Container 和 Simple Associative Container 概念的函数定义要求。以熟悉的函数形式提供了元素插入、删除和检索的功能,封装了二叉树的复杂操作。
头文件
include
set s; //创建了一个空的 set 对象 s ,元素类型为 int
2. set(const key_compare& comp);
指定一个比较函数对象
comp
来创建
set
对象,内存分配器为默认值。
下面的的代码使用自定义的函数对象 strLess ,创建一个 set 容器对象 s 。
// 定义字符串比较函数对象 strLess
struct strLess
{
bool operator()(const char* s1,const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
// 创建 set 容器对象 s
set s(strLess()); //可以自己写一个结构体,在创建的时候传入这个结构体,让set 容器元素的排序,按照我们定义的方式来进行。
3. set(const set&); set
拷贝构造函数,通过红黑树的拷贝构造函数,实现两个
set
容器的元素、头节点和节点个数的拷贝。
// set s1;
set s2(s1);
4. set(InputIterator first, InputIteratorlast);
用迭代器区间
[first, last)
所指的元素,创建一个
set
对象。
例如,下面代码将数组 iArray 的元素插入到 set 容器对象 s 的红黑树中。
int iArray[] = {13, 32, 19};
set s(iArray, iArray + 3);
5. set(InputIteratorfirst, InputIterator last, const key_compare& comp);//
用迭代器区间
[first, last)
所指的元素和
comp
函数对象,创建一个
set
对象。
const char* szArray = {"Hello", "dog", "bird"};
set s(szArray, szArray + 3, strLess());
set sInt;
sInt.insert(10);
pair::iterator, bool> p = sInt.insert(19);
if(p.second)
cout<<"插入新元素"<<*(p.first) << endl;
else
cout<<"已存在该元素,不重复插入"<
set容器提供了一个应用红黑树进行搜索的函数 find ,返回的迭代器值位搜索到的元素位置,如果元素不存在,则返回一个 end结束元素的位置。
iterator find(constkey_type &k) const
#include
#include
int main ()
{
std::set myset;
std::set::iterator it;
//存入一些初始化值:
for (int i=1; i<=5; i++) myset.insert(i*10); // 10 20 30 40 50
it=myset.find(20);//找到
myset.erase (it);//删除
myset.erase (myset.find(40));//如果找到,则删除
std::cout << "myset contains:";
for (it=myset.begin(); it!=myset.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
}
其他函数
set提供的函数还有empty、size、swap、lower_bound、upper_bound和equal_range等
lower_bound(); 下确界函数,返回第一个 > elem 元素的迭代器
upper_bound(); 上确界函数,返回第一个 > elem 元素的迭代器
equal_range(); 返回容器中与elem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。以上函数返回两个迭代器,而这两个迭代器被封装在pair中。
#include
#include
int main ()
{
std::set myset;
for (int i=1; i<=5; i++)
myset.insert(i*10); // myset: 10 20 30 40 50
std::pair::const_iterator,std::set::const_iterator> ret;
ret = myset.equal_range(30);
std::cout << "the lower bound points to: " << *ret.first << '\n';
std::cout << "the upper bound points to: " << *ret.second << '\n';
return 0;
}