set是一个集合容器,其中包含的元素是唯一的,集合中的元素是按照一定的顺序排列的。元素插入过程是按照排序规则插入,所以不能使用指定位置插入。

set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。

set不可以直接存取元素,(不可以使用at.(pos)与[]操作符

multiset与set的区别:set支持唯一键值,每个元素都只能出现一次,而multiset中同一值可以出现多次。

不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的,如果希望修改成同一元素值必须先删除原有的元素,再插入新的元素。

关于set怎样使一个我们自己定义的类型达到我们规定的排序目的呢?

假如定义一个CStudent类怎么样让这个类的元素按照学号来排序呢?

首先我们先来定义这样一个类然后利用set排序就是对operator()进行的重载来比较大小,就自己将这个方法写入到一个结构体中调用它,具体过程如下

 class CStudent
{
public:
int m_n_ID;
string m_strName;
CStudent(int iID, string strName)
{
m_n_ID = iID;
m_strName = strName;
}
}; struct studentFounction
{
bool operator()(const CStudent &stu1,const CStudent &stu2)
{
return (stu1.m_n_ID<stu2.m_n_ID);
} }; set<CStudent,studentFounction> setStu;
setStu.insert(CStudent(,"小王"));
setStu.insert(CStudent(,"小刘"));
setStu.insert(CStudent(,"小李"));
setStu.insert(CStudent(,"小张"));
setStu.insert(CStudent(,"小彭"));
setStu.insert(CStudent(,"小杰"));
for (set<CStudent,studentFounction>::iterator it = setStu.begin();it != setStu.end();it++)
{
cout<<it->m_strName<<endl;
}

值得一说的是在删除中set.erase(elem)//根据元素值删除对应元素

set<int>::iterator it = setInt.find(elem)//返回查找值对应迭代器

set<int>::iterator it = setInt.lower_bound(elem);//返回的是第一个比指定值小的元素迭代器

set.equal_range(elem);//返回容器中与elem相等的上下限的两个迭代器。

而需要注意的是下限是开区间上限是闭区间[beg,end).以上函数返回两个迭代器,而这两个迭代器被封装在pair中。

pair被译为对组,可以将两个视为一个单元。pari<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型

pair.first是pair里面的第一个值,是T1的类型

pair.second是pair里面的第二个值,是T2的类型

multiset可以有相同的元素这是与set的不同之处

STL之set、multiset、functor&pair使用方法的更多相关文章

  1. STL Set和multiset 容器

    STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...

  2. C++ STL set和multiset的使用

    C++ STL set和multiset的使用 std::set<int> s;那个s这个对象里面存贮的元素是从小到大排序的,(因为用std::less作为比较工具.) 1,set的含义是 ...

  3. stl中map的四种插入方法总结

    stl中map的四种插入方法总结方法一:pair例:map<int, string> mp;mp.insert(pair<int,string>(1,"aaaaa&q ...

  4. STL - set和multiset

    set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实现, ...

  5. STL之set && multiset

    一.set 在了解关联容器set之前,让我们先来看看下面这个例子,并猜测该例子输出什么: // stl/set1.cpp #include <iostream> #include < ...

  6. STL之set&multiset使用简介

    关于set,必须说明的是set关联式容器.set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序.应该注 ...

  7. C++ STL——set和multiset

    目录 一 set和multiset 二 对组pair 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一 set和multiset set和multis ...

  8. C++ pair 使用方法

    类模板:template <class T1, class T2> struct pair 參数:T1是第一个值的数据类型,T2是第二个值的数据类型. 功能:pair将一对值组合成一个值, ...

  9. STL:set/multiset用法详解

    集合 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和mul ...

随机推荐

  1. vsftpd安装指南

    如果您用的是Fedora 或Redhat 系统,可以用下面的命令在线安装: [root@localhost ~]# yum install vsftpd 如果是debian 类系统,可以用apt 来在 ...

  2. Linux/Unix下设置定时任务

    Unix系统提供了cron和at命令,使系统和用户可以定时运行一定的程序,而不需手工启动. 使用cron用于周期性的执行一个命令,为了使用它,必须编辑crontab文件.系统缺省的/etc/cront ...

  3. shell脚本学习之Bash shell 里各种括号的用法

    今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...

  4. CSS Outlines

    轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用. 轮廓(outline)属性指定了样式,颜色和外边框的宽度. 轮廓(outline)实例 在元素周围画线本例演 ...

  5. React学习笔记(一) 基础知识

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我. React的基 ...

  6. HDU 3006 The Number of set(位运算 状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3006 题目大意:给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.由给出的集合 ...

  7. deep learning 学习资料

    http://deeplearning.net/tutorial/lenet.html

  8. C#程序中:如何向xml文件中插入节点(数据)

    向xml文件中动态的添加节点(数据)是一件很爽的事,可以给你的程序带来很多的方便,比如在web中,如果你的Flash用到了xml文件,这个方法可以让你在后台就轻轻松松的更新你的Flash内容哦!一起研 ...

  9. 利用青瓷布局自定义加载的场景,而不是自己改写qici-loading

    加载界面如果全部通过自己手动布局不仅不美观,还很难控制.借用原生的场景切换加载效果,来实现我们游戏的加载效果. 没有做加载修改的原来的加载顺序:   黑乎乎界面->(游戏定制的加载)你的第一个场 ...

  10. [CSS]border边框

    border: 1px solid #ccc;    /*1像素 实线 灰色*/可分割成:border-width:1px;border-style: solid; border-color: #00 ...