/*
3.7.2 set常用API
3.7.2.1 set构造函数
set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set& st);//拷贝构造函数
3.7.2.2 set赋值操作
set & operator=(const set & st);//重载等号操作符
swap(st);//交换两个集合容器
3.7.2.3 set大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空3.7.2.4 set插入和删除操作
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。
*/
#include <iostream>
#include <string>
#include <set>
using namespace std;void printSetInt(set<int> &s) {for (set<int>::iterator it = s.begin(); it != s.end(); ++it) {cout << (*it) << endl;}
}
void test1() {//set 是关联式容器, 关联式容器在插入的时候自动排好序// 序列式容器, 怎么插入的就怎么排序set<int> s1;s1.insert(5);s1.insert(3);s1.insert(1);s1.insert(7);s1.insert(9);printSetInt(s1);if (s1.empty()) {cout << "s1 is empty" << endl;}else {cout << "s1 size of " << s1.size() << endl;}s1.erase(s1.begin());s1.erase(3);printSetInt(s1);
}
/*
3.7.2.5 set查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
*/
void test2() {set<int> s1;s1.insert(5);s1.insert(3);s1.insert(1);s1.insert(7);s1.insert(9);set<int>::iterator pos = s1.find(3);if (pos!=s1.end()) {cout << "找到了 值为" << (*pos) << endl;}else {cout << "未找到" << endl;}int num = s1.count(1); cout << "1 的个数为" << num << endl;set<int>::iterator lb = s1.lower_bound(3);if (lb != s1.end()) {cout << "lower_bound(3) 为" << *lb << endl;} else {cout << "未找到" << endl;}set<int>::iterator ub = s1.upper_bound(3);if (ub != s1.end()) {cout << "upper_bound(3) 为" << *ub << endl;}else {cout << "未找到" << endl;}pair<set<int>::iterator, set<int>::iterator> er = s1.equal_range(3);if (er.first != s1.end()) {cout << "找到 s1.equal_range(3)的lower_bound为" << *(er.first) << endl;} else {cout << "未找到" << endl;}if (er.second != s1.end()) {cout << "找到 s1.equal_range(3)的upper_bound为" << *(er.second) << endl;}else {cout << "未找到" << endl;}
}// 创建pair的方式   对组
void test3() {//第一种pair<string, int> p(string("Tom"), 10);// 取值cout << "name is " << p.first << endl;cout << "age is " << p.second << endl;//第二种pair<string, int> p2 = make_pair("Jerry", 15);// 取值cout << "name is " << p2.first << endl;cout << "age is " << p2.second << endl;
}void test4() {// set容器不允许插入重复的值set<int> s1;pair<set<int>::iterator, bool> ret = s1.insert(10);if (ret.second) {cout << "10 插入成功" << endl;} else {cout << "10 插入失败" << endl;}pair<set<int>::iterator, bool> ret2 = s1.insert(10);if (ret2.second) {cout << "10 插入成功" << endl;}else {cout << "10 插入失败" << endl;}
}//仿函数
class MySort {
public:bool operator()(int v1, int v2) const {return v1 > v2;}
};void printSetIntSort(set<int, MySort> &s) {for (set<int>::iterator it = s.begin(); it != s.end(); ++it) {cout << (*it) << endl;}
}
// set容器排序
void test5() {// <> 里面,第二个参数可以指定排序规则,但是因为<>需要类型,所以这里需要用到仿函数set<int, MySort> s1;s1.insert(5);s1.insert(3);s1.insert(1);s1.insert(7);s1.insert(9);printSetIntSort(s1);
}//set 插入自定义数据类型
class Person {
public:Person(string name, int age) {this->m_name = name;this->m_age = age;}string m_name;int m_age;/*bool operator== (Person& p1) {if (this->m_age==p1.m_age && this->m_name == p1.m_name) {return true;}return false;}*/
};//自定义数据类型指定排序规则时所有成员都得是const成员
class compare01
{
public:bool operator()(const Person& p1, const Person& p2)const{return p1.m_age > p2.m_age;}
};void test6() {set<Person, compare01> s1; Person p1("大娃", 25);Person p2("二娃", 20);Person p3("五娃", 15);Person p4("三娃", 22);Person p5("爷爷", 55); // 这里如果爷爷的年龄和大娃一样,就无法插入到s1,当中, 应该用的是年龄做判断s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);s1.insert(p5);for (set<Person>::iterator it1 = s1.begin(); it1 != s1.end(); ++it1) {cout << "name is " << (*it1).m_name << " age is" << (*it1).m_age << endl;}cout << "-----" << endl;//s1.erase(p5);for (set<Person>::iterator it1 = s1.begin(); it1 != s1.end(); ++it1) {cout << "name is " << (*it1).m_name << " age is" << (*it1).m_age << endl;}Person p6("三娃", 22);cout << "-----" << endl;s1.erase(p6); // Person类就算没有重载 == 运算符,也能把三娃删除掉// set容器删除元素,判断是否相等, 是通过compare01来判断的for (set<Person>::iterator it1 = s1.begin(); it1 != s1.end(); ++it1) {cout << "name is " << (*it1).m_name << " age is" << (*it1).m_age << endl;}
}
int main()
{//test1();//test2();//test3();//test4();   //test5();test6();return 0;
}

C++ STL容器值set相关推荐

  1. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  2. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除 ...

  3. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...

  4. 【小白学习C++ 教程】二十一、C++ 中的STL容器Arrays和vector

    @Author:Runsen C++的标准模板库(STL)是提供数组.向量.队列等数据结构的模板类的集合.STL是由容器.算法.迭代器组成的库. 容器 容器存储对象和数据.它们基本上是基于模板的泛型类 ...

  5. c++ map 修改value_C++知识分享之STL容器:set 容器与 map 容器的简单应用

    set容器中一些函数,取自百度其他大佬已总结好的,如有侵权,请联系删除! set的各成员函数列表如下: c++ stl容器set成员函数:begin()--返回指向第一个元素的迭代器 c++ stl容 ...

  6. c++STL容器的Map和multimap

    STL容器的Map和multimap map/multimap的简介 map/multimap对象的默认构造 map的插入与迭代器 迭代器遍历 map对象的拷贝构造与赋值 map的大小 map的删除 ...

  7. c++STL容器的Set和multiset

    STL容器的Set和multiset set/multiset的简介 set的插入与迭代器 Set集合的元素排序 set对象的拷贝构造与赋值 set的大小 set的删除 set的查找 pair的使用 ...

  8. c++STL容器的Deque

    STL容器的Deque Deque简介 deque对象的默认构造 deque末尾的添加移除操作 deque的数据存取 deque与迭代器 deque对象的带参数构造 deque的赋值 deque的大小 ...

  9. c++STL容器的Vector

    STL容器的Vector Vector容器简介 vector对象的默认构造 vector对象的带参数构造 vector的赋值 vector的大小 vector末尾的添加移除操作 vector的数据存取 ...

最新文章

  1. 讽刺笑话_完全不讽刺的2019年网络设计指南
  2. 竞赛提升:必知必会的21篇论文!
  3. Kinect深度图像滤波
  4. vue结合ueditor富文本编辑器(换肤分离)
  5. php接口开发 安全_PHP开发api接口安全验证的实例讲解
  6. 员工激励手段1+1组合出击
  7. 用计算机弹传说之下鱼姐的bgm,传说之下战斗曲曲谱_传说之下打托丽尔的bgm
  8. Zabbix中文使用手册
  9. R语言绘图大小及图例问题
  10. 将 Hexo 部署到阿里云轻量服务器
  11. VS code入门笔记(一)常用标签介绍
  12. FTP上传文件0字节问题
  13. 身上黑色素怎么去除?去黑色素方法
  14. 室内定位导航-室内地图导航-高精度地图应用场景
  15. 用maven-replacer插件选择正则表达式替换
  16. 递归查询数据库中树状数据
  17. 电影成O2O圈地利刃 百度糯米影业进入加速快车道
  18. HEVC(H.265) 基础知识
  19. E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 1446 (unattended-upgr)报错信解决
  20. 微信小程序实时日志wx.getRealtimeLogManager——远程监控小程序日志

热门文章

  1. @Transcational特性
  2. Elasticsearch环境搭建和介绍(Windows)
  3. 08 Spring框架 AOP (一)
  4. sql查询语句for xml path语法
  5. Android 学习Kotlin吗?
  6. python之路-SQLAlchemy
  7. [LeetCode] Maximal Rectangle
  8. C语言一个小小的问题引起的对指针的探究。。。
  9. mocha 测试 mysql_e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDrive
  10. 计算机科学研究生规划,2019计算机考研备考:计算机科学与技术研究方向及复习规划...