set/multiset容器
一、二叉树基本概念
二叉树就是任何节点最多只允许有两个子节点。分别是左子节点和右子节点。

二叉搜索树,是指二叉树中的节点按照一定的规则进行排序,使得对二叉树中元素访问更加高效。二叉搜索树的放置规则是:任何节点的元素值一定大于其左子树中的每一个节点的元素值,并且小于右子树的值。因此从根节点一直向左走,一直到无路可走,即得到最小值,一直向右走,直到无路可走,可得到最大值。那么在二叉搜索树中找到最大元素和最小元素是非常简单的事情。
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容器的更多相关文章
- STL学习系列八:Set和multiset容器
1.set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. set采用红黑树变体的数据结构实 ...
- STL之Set和multiset容器
1.Set和multiset容器 1)set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指定插入位置. 2)set采用红黑树变体的数据 ...
- C++ STL 学习笔记__(7)Set和multiset容器
10.2.8 Set和multiset容器 set/multiset的简介 ² set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列.元素插入过程是按排序规则插入,所以不能指 ...
- STL Set和multiset 容器
STL Set和multiset 容器 set/multiset的简介 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列. 元素插入过程是按排序规则插入,所以不能指定插入位 ...
- 第十三篇:multimap容器和multiset容器中的find操作
前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...
- multimap容器和multiset容器中的find操作
前言 multimap容器是map容器的“ 增强版 ”,它允许一个键对应多个值.对于map容器来说,find函数将会返回第一个键值匹配元素所在处的迭代器.那么对于multimap容器来说,find函数 ...
- set和multiset容器
set和multiset容器的能力 set 和multiset容器的内部结构通常由平衡二叉树(balanced binary tree)来实现.当元素放入容器中时,会按照一定的排序法则自动排序,默认是 ...
- stl之multiset容器的应用
与set集合容器一样,multiset多重集合容器也使用红黑树组织元素数据,仅仅是multiset容器同意将反复的元素健值插入.而set容器则不同意. set容器所使用的C++标准头文件set.事实上 ...
- 详解C++ STL multiset 容器
详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...
- multiset容器erase函数的误用
<从缺陷中学习C/C++>第3章库函数问题,本章主要介绍库函数的使用中会遇到的问题.使用库函数可以降低软件开发的难度,提高代码编写的效率.本节为大家介绍multiset容器erase函数的 ...
随机推荐
- 每天一个Linux命令(57)rpm命令
rpm是一个功能十分强大的软件包管理系统. (1)用法: 用法: rpm [参数] [包名] (2)功能: 功能: 使得在Linux下安装.升级和删除软 ...
- java PinYinUtils 拼音工具类
package com.sicdt.library.core.utils; import java.util.HashSet; import java.util.Set; import net.sou ...
- Python自然语言处理 - 系列三
有监督分类过程 ![enter image description here][1]例子:涉及一个特征器,给定一个姓名分析出是男性名字还是女性名字 分析:男性和女性的名字有一些鲜明的特点.以a,e 和 ...
- MySQL-5.7权限详解
1.MySQL权限级别 (1)全局性管理权限 作用于整个MySQL实例级别 *.*代表所有数据库的权限 mysql> grant all on *.* to 'test'@'%'; Query ...
- 20145240《Java程序设计》课程总结
20145240<Java程序设计>课程总结 每周读书笔记链接汇总 20145240 <Java程序设计>第一周学习总结:http://www.cnblogs.com/2014 ...
- poj 3468 线段树模板题
#include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #def ...
- CCNA 课程 三
交换机的MAC地址学习情况: 1.从一个接口收到数据帧,根据数据帧的原mac地址查找交换机的mac地址表,如果没有找到,将会添加数据帧的原mac地址和收到数据帧接口的对应条目,放进交换机的mac地址表 ...
- HMM代码实现
按照网上的代码,自己敲了一下,改了一点点,理解加深了一下. 还有训练HMM的EM算法没看懂,下次接着看: 参考连接:http://www.cnblogs.com/hanahimi/p/4011765. ...
- Luogu-4022 [CTSC2012]熟悉的文章
广义后缀自动机+DP 对于作文库建出广义后缀自动机,广义自动机就是在每次添加一个字符串之前把\(last=0\),然后正常添加就好了 对于每个询问串,预处理出每个位置\(i\)能向前匹配的最长长度\( ...
- 使用Homebrew管理你的mac开发包
很多人可能不了解 Homebrew, 其实它相当于开发软件界的 Appstore. 比如,如果我要安装 python 的最新版本,那么传统的做法是 1. 到官方网站下载 python 的最新版本 2. ...