STL容器大的方向分为两类,序列式容器和关联式容器。

这两者通过数据在容器内的排列来区分。关联容器和顺序容器的根本不同在于:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素则是按它们在容器中的位置来顺序保存和访问的。

序列容器包括:vector、list、stack、queue、priority_queue 等

关联容器包括:set、multiset、map 等

SET && MULTISET

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

定义 set<int> s;

定义 multiset<int> ss; multiset 里面允许有重复的数字,且按照顺序排列

s.insert() 插入元素

s.begin() 返回set容器第一个元素的地址

s.end() 返回set容器的最后一个元素地址

s.size() 返回当前set容器中的元素个数

s.clear() 删除set容器中的所有的元素

s.empty() 判断set容器是否为空

s.rbegin() 返回的值和end()相同

s.rend() 返回的值和rbegin()相同

#include <iostream>
#include <set>using namespace std;int main ()
{//定义 set<int> s;//插入  int cnt = 10,x;while(cnt--){cin >> x;s.insert(x); }//迭代器 set<int>::iterator it;//输出 ,遍历 for(it=s.begin();it!=s.end();it++){cout << *it << " "; } cout << endl;    //s.size()返回容器中的元素个数 cout << "一共有" <<s.size() << "个元素\n" ;//10s.clear();if(s.empty()==1){cout << "set 为空 !\n";}cout << "s.clear()之后,一共有" <<s.size() << "个元素\n" ;//0return 0;
}

     

s.count() :这个是看在set种出现的次数,但是在set里没有重复的元素,所以只可能是0和1,所以用来判断是不是set中的元素

s.find():用来查找set中某个元素出现的位置。如果找到,就返回这个元素的迭代器,如果这个元素不存在,则返回 s.end() 。 (最后一个元素的下一个位置,s为set的变量名)

#include <iostream>
#include <set>using namespace std;int main ()
{set<int> s;//插入 s.insert(10);s.insert(10);s.insert(20);s.insert(30);//遍历set<int>::iterator it;cout << "10出现的次数:" << s.count(10) << endl; cout << "20出现的次数:" << s.count(20) << endl; return 0;
} 
#include <iostream>
#include <set>using namespace std;int main ()
{set<int> s;//插入 s.insert(10);s.insert(10);s.insert(20);s.insert(30);//遍历set<int>::iterator it;it = s.find(30);if(it==s.end())cout << "没找到!";elsecout << "找到" << *it; return 0;
} 

erase(iterator)  ,删除定位器iterator指向的值

erase(first,second),删除定位器first和second之间的值

erase(key_value),删除键值key_value的值

小结:set中的删除操作是不进行任何的错误检查的,比如定位器的是否合法等等,所以用的时候自己一定要注意。

#include <iostream>
#include <set>using namespace std;int main ()
{set<int> s;set<int>::iterator it;set<int>::iterator first,second; for(int i=1;i<=20;i++)s.insert(i);//删除 1 s.erase(s.begin());//删除2-4之间的数 (不包括4) first=s.begin();//2 second=s.begin();second++;second++; s.erase(first,second);s.erase(10);//10for(it=s.begin();it!=s.end();it++){cout << *it <<" ";}//输出:4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20 return 0;
} 

lower_bound(key_value) ,返回第一个大于等于key_value的定位器

upper_bound(key_value),返回最后一个大于等于key_value的定位器

#include <iostream>
#include <set>  using namespace std;  int main()
{  set<int> s;  s.insert(1);  s.insert(3);  s.insert(4);  s.insert(5);cout<<*s.lower_bound(2)<<endl;  //3cout<<*s.lower_bound(3)<<endl;  //3cout<<*s.upper_bound(3)<<endl;  //4return 0;
}  

SET 自定义排序

set 里默认为less 函数,从小到大

#include <iostream>
#include <set>
#include <string>using namespace std;struct cmp
{bool operator() (const int &a ,const int &b) const{return a>b;}
};int main()
{set<int,cmp> s;for(int i=1;i<=20;i++){s.insert(i);}set<int,cmp>::iterator it;for(it=s.begin();it!=s.end();it++){cout << *it << " ";}return 0;
}
//输出:20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
#include <iostream>
#include <set>
using namespace std;int main()
{set<int,greater<int> > s;for(int i=1;i<=20;i++){s.insert(i);}set<int,greater<int> >::iterator it;for(it=s.begin();it!=s.end();it++){cout << *it << " ";}return 0;
}

结构体+set+排序:

#include<iostream>
#include<set>
#include<string>
using namespace std;
struct Info
{string name;double score;
};struct cmp
{bool operator () (const Info &a,const Info &b) const // 重载“<”操作符,自定义排序规则{//按score由大到小排序。//如果是由小到大排序则是 <  return a.score > b.score;}
};int main()
{set<Info,cmp> s;Info info;//插入三个元素info.name = "Jack";info.score = 80;s.insert(info);info.name = "Tom";info.score = 99;s.insert(info);info.name = "Steaven";info.score = 60;s.insert(info);set<Info,cmp>::iterator it;for(it = s.begin(); it != s.end(); it++)cout << (*it).name << " : " << (*it).score << endl; return 0;
}
/*
运行结果:
Tom : 99
Jack : 80
Steaven : 60
*/
struct Info
{string name;double score;friend bool operator < (Info a,Info b) // 重载“<”操作符,自定义排序规则{//按score由大到小排序。//如果是由小到大排序则是 <  return a.score > b.score;}
};
struct Info
{string name;double score;bool operator < (const Info & a) const{return score > a.score;}
};

STL set multiset相关推荐

  1. STL之multiset中equal_range,multimap中的equal_range,bitset容器,string字符串操作,lambda表达式

     1multiset中用equal_range来遍历所有的元素 #include <set> #include <iostream> using namespace std ...

  2. stl的multiset和set和priority_queue区别

    优先级队列只允许按照排序顺序访问一个元素 - 即,可以获得最高优先级的项目,而当删除该项目时,可以获得下一个最高优先级,依此类推. 优先级队列还允许重复元素,因此它更像是一个multiset而不是se ...

  3. STL之multiset简介

    2019独角兽企业重金招聘Python工程师标准>>> 1.简介 multiset跟set具有相同功能,但允许重复的元素.multiset容器的内部结构通常由平衡二叉树(balanc ...

  4. stl之multiset容器的应用

    与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,只是multiset容器允许将重复的元素健值插入,而set容器则不允许. set容器所使用的C++标准头文件set,其实也是 ...

  5. Codeforces-808D Array Division (multiset 折半???)

    题目链接: http://codeforces.com/problemset/problem/808/D 题意: 给定一个数列,移动0或1个数字,使数列能从某个位置分开前后两半的和相等. 思路: fr ...

  6. uestc 1593 老司机破阵(线段树 or multiset)

    老司机破阵 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  St ...

  7. [STL]六大组件介绍(目录 全)

    一般介绍 STL(Standard TemplateLibrary),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库(C++ Standard Library)中, ...

  8. AtCoder - ABC 170 - D(思维+数论)E(STL+模拟)

    D - Not Divisible 题意: 现有一个长度为 n 的序列 A,请你输出满足以下条件的所有整数  的数量: 对于每一个整数 j (1 ≤ j ≤ n且 i ≠ j) ,  ≠ 0 ( mo ...

  9. 编程之美2.5 寻找最大的K个数

    在一个数组中寻找最大的K个数,我们首先说一种非常简单的方法,利用快速排序中的分割算法,即我们经常看见的partition.这个函数会返回一个 int 类型的值,这个值代表的是前一半数字和后一半数字的分 ...

最新文章

  1. R语言dplyr包进行dataframe的连接(inner_join、left_join、right_join、full_join、semi_join、anti_join)操作实战
  2. ICMP 隧道——将流量封装进 IMCP 的 ping 数据包中,旨在利用 ping 穿透防火墙的检测...
  3. 哨兵一号数据snap预处理_利用SNAP软件进行Sentinel-1A卫星微波影像的预处理
  4. 局域网在线监控设备扫描工具V1.0软件说明
  5. 倍福服务器维修,Beckhoff TwinCAT
  6. Ideal 使用帮助手册
  7. Nested Loop Join入门
  8. HDU 2815 扩展baby step giant step 算法
  9. WebApp与HybridApp
  10. 汇编语言编译文件报 error A2105: Excepted: instruction or directive
  11. yolov5测试单张图片
  12. js中Error对象
  13. linux和window 双系统,如何构建 Linux 和 Windows 共存的双系统
  14. 深耕硬科技,香港科大百万创赛与八大投资机构签署合作意向
  15. 商城项目---(一)搭建
  16. 华为存储OceanStor 5110V5 CA证书即将过期告警处理
  17. 第 12 代智能英特尔酷睿移动式处理器
  18. 基于Bootstrap的后台管理界面
  19. element ui中穿梭框等列表文字显示过长隐藏问题处理
  20. matlab 稀疏随机矩阵,MATLAB中的稀疏数组

热门文章

  1. 国开计算机组成原理,国开计算机组成原理.docx
  2. linux制作共享服务器,Linux如何制作一个简单的共享服务器
  3. Windows server2008服务器设置多用户登录
  4. Kotlin学习笔记-基础语法
  5. [转]cocos2d-js 3.0 屏幕适配方案 分辨率适应
  6. android TextView里边实现图文混配效果
  7. iOS多线程编程之NSOperation和NSOperationQueue的使用
  8. 菜鸟学习HTML5+CSS3(一)
  9. 专业研究HP procurve网络、阿姆瑞特和系统集成的论坛
  10. IDEA打包出现Unable to find main class