STL之set、multiset、functor&pair使用方法
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使用方法的更多相关文章
- STL Set和multiset 容器
STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...
- C++ STL set和multiset的使用
C++ STL set和multiset的使用 std::set<int> s;那个s这个对象里面存贮的元素是从小到大排序的,(因为用std::less作为比较工具.) 1,set的含义是 ...
- stl中map的四种插入方法总结
stl中map的四种插入方法总结方法一:pair例:map<int, string> mp;mp.insert(pair<int,string>(1,"aaaaa&q ...
- STL - set和multiset
set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实现, ...
- STL之set && multiset
一.set 在了解关联容器set之前,让我们先来看看下面这个例子,并猜测该例子输出什么: // stl/set1.cpp #include <iostream> #include < ...
- STL之set&multiset使用简介
关于set,必须说明的是set关联式容器.set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序.应该注 ...
- C++ STL——set和multiset
目录 一 set和multiset 二 对组pair 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一 set和multiset set和multis ...
- C++ pair 使用方法
类模板:template <class T1, class T2> struct pair 參数:T1是第一个值的数据类型,T2是第二个值的数据类型. 功能:pair将一对值组合成一个值, ...
- STL:set/multiset用法详解
集合 使用set或multiset之前,必须加入头文件<set> Set.multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素. sets和mul ...
随机推荐
- 求最低分最高分---c#(冒泡排序的运用)
// 输入10个人的分数,去掉两个最高两个最低,求平均分 Console.Write("请输入人数:"); int renshu = int.Parse(Console.ReadL ...
- java动态绑定的情况分析
java是面向对象的语言,java中多态的一种情况是动态绑定.所谓的动态绑定,分两种情况:当调用类方法的时候,java虚拟机会基于对象的引用类型来选择执行方法.当java调用一个实例方法的时候,他会根 ...
- 请描述一下 cookies,sessionStorage 和 localStorage 的区别?
http://handyxuefeng.blog.163.com/blog/static/454521722013111714040259/ http://book.51cto.com/art/201 ...
- Spring回顾
1.IOC和DI IOC:Inversion of Control(控制反转)是一个重要的面对对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. IOC理解:将组件对象的控 ...
- _BLOCK_TYPE_IS_VALID 问题解析及处理
直接原因: 释放内存时,内存已经被修改或释放. 产生可能: 1.内存越界操作,踩了待释放指针头信息. 2.重复释放指针. 处理: 采用排除法,逐步屏蔽掉一些代码,当屏蔽某些代码时,不抛此异常,说明问题 ...
- 使用java.util.Timer来周期性的执行制定的任务
使用java.util.Timer来周期性的执行制定的任务 public class HandlerTest extends Activity { int[] images = new int[] { ...
- 使用微信api接口开发的框架
<?php/** * 微信公众平台API */class WeixinChat{ private $token; private $appid; private $appsecret; priv ...
- clipboard让复制的文本换行
https://clipboardjs.com/dist/clipboard.min.js 用clipboard实现复制时, 想让复制的文本换行, 有两咱方法: 第一种, HTML实现: <!- ...
- 彻底弄清c标准库中string.h里的常用函数用法
在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你 ...
- Vive开发教程汇总
最近在整理在HTC Vive平台上开发VR应用程序的教程,现在把结果全部汇总在下面的表格里,希望更多的开发者参与到VR内容的开发之中,真的很好玩.现在主流的开发VR应用的引擎是Unity3D和Unre ...