一、二叉树基本概念

二叉树就是任何节点最多只允许有两个子节点。分别是左子节点和右子节点。

二叉搜索树,是指二叉树中的节点按照一定的规则进行排序,使得对二叉树中元素访问更加高效。二叉搜索树的放置规则是:任何节点的元素值一定大于其左子树中的每一个节点的元素值,并且小于右子树的值。因此从根节点一直向左走,一直到无路可走,即得到最小值,一直向右走,直到无路可走,可得到最大值。那么在二叉搜索树中找到最大元素和最小元素是非常简单的事情。

RB-tree(红黑树)为二叉树的一种。

二、set/multiset特性

set/multiset的特性是所有元素会根据元素的值自动进行排序。set以RB-tree(红黑树,平衡二叉树的一种)为底层机制,其查找效率非常好。set容器中不允许重复元素,multiset允许重复元素。

问:可以通过set的迭代器改变元素的值吗?

答:不行,因为set集合是根据元素值进行排序,关系到set的排序规则,如果任意改变set的话,会严重破坏set组织。

三、set常用API

1、set构造函数

2、set赋值操作

3、set大小操作

4、set插入和删除操作

5、set查找操作

四、案例

程序运行不成功,还未找到原因!

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
using namespace std; void PrintSet(set<int>& s)
{
for (set<int>::iterator it = s.begin();it != s.end();it++)
{
cout << *it << " ";
}
cout << endl;
} void test01()
{
//set初始化操作
set<int> s1;
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert(); PrintSet(s1);//1 2 4 5 7
//自动进行排序 默认从小到大 //赋值操作
set<int> s2;
s2 = s1;
PrintSet(s2);//1 2 4 5 7 //删除操作
s1.erase(s1.begin());
PrintSet(s1);//2 4 5 7
s1.erase();
PrintSet(s1);//2 4 5
} //set查找操作
void test02()
{
set<int> s1;
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert(); set<int>::iterator ret = s1.find();
if (ret == s1.end())
{
cout << "没有找到!" << endl;//没有找到!
}
else
{
cout << "ret:" << *ret << endl;
} //找到第一个大于等于key的元素
ret = s1.lower_bound();
if (ret == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;//ret:2
} //找到第一个大于key的元素
ret = s1.upper_bound();
if (ret == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "ret:" << *ret << endl;//ret:4
} //equal_range 返回lower_bound和upper_bound的值
pair<set<int>::iterator, set<int>::iterator> myret = s1.equal_range();
if (myret.first == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "myret:" << *(myret.first) << endl;//myret:2
}
if (myret.second == s1.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "myret:" << *(myret.second) << endl;//myret:4
}
}
int main(void)
{
//test01();
test02();
return ;
}

五、set容器存储对象 更改默认排序

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
using namespace std; //仿函数
class mycompare
{
public:
bool operator()(int v1, int v2)
{
return v1 > v2;
}
}; void test01()
{
//set初始化操作
set<int, mycompare> s1;
s1.insert();
s1.insert();
s1.insert();
s1.insert();
s1.insert(); for (set<int>::iterator it = s1.begin();it != s1.end();it++)
{
cout << *it << " ";
}
cout << endl;
} class Person
{
public:
Person(int age,int id):id(id),age(age){}
public:
int id;
int age;
}; //仿函数
class mycompare2
{
public:
bool operator()(Person p1, Person p2)
{
return p1.age > p2.age;
}
};
void test02()
{
set<Person,mycompare2> sp;
Person p1(, ), p2(, ), p3(, );
sp.insert(p1);
sp.insert(p2);
sp.insert(p3); Person p4(, ); for (set<Person, mycompare2>::iterator it = sp.begin();it != sp.end();it++)
{
cout << (*it).age << " " << (*it).id << endl;
} //查找
set<Person, mycompare2>::iterator ret = sp.find(p4);
if (ret == sp.end())
{
cout << "没有找到!" << endl;
}
else
{
cout << "找到:" << (*ret).id << " " << (*ret).age << endl;
} } int main(void)
{
//test01();
test02();
return ;
}

set/multiset容器的更多相关文章

  1. STL学习系列八:Set和multiset容器

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

  2. STL之Set和multiset容器

    1.Set和multiset容器 1)set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2)set采用红黑树变体的数据 ...

  3. C++ STL 学习笔记__(7)Set和multiset容器

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

  4. STL Set和multiset 容器

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

  5. 第十三篇:multimap容器和multiset容器中的find操作

    前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...

  6. multimap容器和multiset容器中的find操作

    前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...

  7. set和multiset容器

    set和multiset容器的能力 set 和multiset容器的内部结构通常由平衡二叉树(balanced binary tree)来实现.当元素放入容器中时,会按照一定的排序法则自动排序,默认是 ...

  8. stl之multiset容器的应用

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

  9. 详解C++ STL multiset 容器

    详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...

  10. multiset容器erase函数的误用

    <从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...

随机推荐

  1. Java生成json

    JSON(JavaScript Object Notation):一种轻量级的数据交换格式: Be JSON:在线JSON校验格式化工具 www.bejson.com 需求:编写代码生成如下的json ...

  2. mysql利于cte进行分组统计并计算占比

    CTE定义:一个公共表表达式(common table expression)是一个命名的临时结果集,它在一条单独的语句中有效,可以在语句中被引用多次. CTE基本语法: WITH cte1 [(co ...

  3. [POI2008]砖块Klo

    题目 爆炸\(OJ\)机子太慢了吧实在不想打平衡树了 做法 烂大街的一个概念:求中位数 然后求前缀差和后缀差,主席树模板题 注意\(int\)和\(long long\) My complete co ...

  4. 在vim下按ctrl+s后界面卡住

    用惯了window编辑器的我们,在使用linux vim编辑器时会不会遇到这个问题:在编辑时总是会不小心按下Ctrl+S,然后整个终端都没有反应了?其实在Linux下 Ctrl+S是有特殊的用途的,不 ...

  5. python 运行报错 Process finished with exit code -1073741819 (0xC0000005)

    发现是由于openpyxl模块导致的,去掉这个模块的内容就能运行,import openpyxl就运行不起来, 将openpyxl卸载了重装, 以及更换了不同的openpyxl版本,都不行,还是运行不 ...

  6. request模块 一基础部分

    一.HTTP请求   通过requests发送网络请求,方法有get post put delete head options import requests r=requests.get(" ...

  7. 20145240 《Java程序设计》第三次实验报告

    20145240 <Java程序设计>第三次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.22 实验 ...

  8. Kubernetes Horizontal Pod Autoscaler

    非常牛逼的技术,目前最新的版本支持众多的Feature HPA功能需要Heapster收集的CPU.内存等数据作为支撑 配置示例: apiVersion: autoscaling/v2beta1 ki ...

  9. 使用shell统计字符串出现的次数,并从大到小进行排序显示

  10. mysql中两表更新时产生的奇葩问题,产生死锁!

    如下一个两表更新语句 UPDATE hzxm201610 a,xmhzylb1201610 b SET a.gk07_1_6=b.gk04_11,a.gk07_2_6=b.f06_1,a.gk07_3 ...