set 和multiset 都会根据特定的排序规则将元素排序。区别在于multiset允许元素重复,而set不允许。
排序准则定义:1.反对称的 ,op(x,y)为真,则op(y,x) 为假。
2.可传递的,op(x,y)为真,op(y,z)为真,则op(x,z)为真。
3.非自反的,op(x,x)永远为假。
set和multiset都以rb-tree实现。o(lgn)的复杂度,大大提升了排序的速度。
#include
namespace std
{
template,//定义排序准则,
//如没有特别定义,就使用缺省准则less(operator<)
class Allocator =allocator >//定义内存模型
class set;
template,
class Allocator =allocator >
class multiset;
}
//Set和Multiset的构造
set //以less(perator<)为排序准则
set //以Op为排序准则
multiset //以less(perator<)为排序准则
multiset //以Op为排序准则
//非变动性操作
//Set和Multiset的非变动性操作
set< > c1,c2;
c1.size();//返回容器大小
c1.empty();//判断容器是否为零
c1.max_size();//返回可容纳的最大元素数量
c1==c2;
c1!=c2;
c1c2;
c1<=c2;
c1>=c2;//比较动作系列以“字典顺序”来判断两个容器是否相等
//但必须是同类型的
//Set和Multiset的搜寻函数
count(elem);//返回元素值为elem的元素个数
find(elem);//返回元素值为elem的第一个元素,找不到就返回end()
lower_bound(elem);//返回elem<=元素值的第一个元素位置用于插入elem
upper_bound(elem);//返回elem<元素值的第一个元素位置用于插入elem
equal_range(elem);//将lower_bound()和upper_bound()的返回值做成一个pair返回
//所以返回的是一个区间
//赋值
//Set和Multiset的赋值操作
c1=c2;//将c2的值全部赋值给c1
c1.swap(c2);//c1和C2的值全部互换
swap(c1,c2);//同上,但是全局函数
//迭代器相关函数
//Set和Multiset的迭代器相关函数
c.begin();//指向第一元素的双向迭代器
c.end();//指向最后一个元素的下一位的双向迭代器
c.rbegin();//逆向遍历时的第一个元素,逆向迭代器
c.rend();//逆向遍历时最后一个元素的下一位,逆向迭代器
//Set和Multiset的元素插入和移除
c.insert(elem);//返回新元素的位置
c.insert(pos,elem);//返回新元素的位置(pos作为插入操作的提示)
c.insert(beg,end);//将区间[beg,end]内所有的所有元素插入至c
c.erase(elem);//删除与elem相等的所有元素,返回删除的个数
c.erase(pos);//删除迭代器pos上所指的元素,无返回值
c.erase(beg,end);//删除[beg,end]内的所有元素,无返回值
c.clear();//清空c,删除全部元素
本文详细介绍了C++ STL中set与multiset容器的区别,包括它们的排序规则、内部实现方式以及如何进行构造和非变动性操作。此外还探讨了它们在实际应用中的优势。
757

被折叠的 条评论
为什么被折叠?



