一、二叉树基本概念

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

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

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. asp.net 移除Server, X-Powered-By, 和X-AspNet-Version头

    我们在开发Asp.net中,最后部署在IIS上. 然后发送HTTP请求,返回的HTTP头中包含Server, X-Powered-By, 和 X-AspNet-Version信息. 这些信息有时给攻击 ...

  2. mybatis中collection和association的作用以及用法

    deptDaoMapper.xml 部门对应员工(1对多的关系) <resultMap type="com.hw.entity.Dept" id="deptinfo ...

  3. Linux用户和用户组管理 用户管理相关命令

    用户添加命令 useradd 注意: 新添加的用户如果不设定密码是不能够登录系统的 命令格式: [root@localhost ~]#useradd [选项] 用户名 选项说明: 选项 选项说明 -u ...

  4. Android : 反射机制获取或设置系统属性(SystemProperties)【转】

    本文转载自:https://blog.csdn.net/wei_lei/article/details/70312512 Android.os.SystemProperties 提供了获取和设置系统属 ...

  5. java进阶之-Maven,svn,git,maven合拼多个项目

    git的使用介绍(写很容易懂得哦) maven合拼多个项目(写得很好哦) MAVEN作用:统一开发规范与工具:统一管理jar包 1.下载MAVEN  下载绿色版的面安装 2.环境配置 eclipse想 ...

  6. 泛型学习第一天:List与IList的区别 (三)

    已经有很多人讨论过IList和List的区别,恩,我也赞同其中的一些观点,其实他们二者也是有优有劣的,看你着重用在哪个方面,先贴一下我赞同的意见,基本上也都是网友们总结的. 首先IList 泛型接口是 ...

  7. java基础11(IO流)-字符流

    转换流 由于字节流操作中文不是特别方便,所以java中提供了转换流 编码表:由现实世界的字符和对应的数值组成的一张表 编码:把看得懂的变成看不懂的(String-------byte[]) 解码:把看 ...

  8. jquery01-简介+语法+选择器+事件

    jQuery是一个JavaScript函数库,是一个轻量级的"写的少,做的多"的JavaScript库,包含以下功能: HTML 元素选取 HTML 元素操作 CSS 操作 HTM ...

  9. 使用Properties读写属性文件

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; /*Prop ...

  10. Specify compute hosts with SSDs

    scheduler_driver = nova.scheduler.filter_scheduler.FilterScheduler scheduler_available_filters = nov ...