STL之红黑树容器:set,hash_set,multiset,hash_map,multimap
1红黑树set(不能包含重复元素)
案例1:红黑树容器set,插入,查找
#include<iostream>
#include<set>
usingnamespacestd;
//set中不能有重复的元素,它是一个红黑树容器
voidmain()
{
set<int>myset;
myset.insert(10);
myset.insert(9);
myset.insert(8);
myset.insert(7);
myset.insert(5);
myset.insert(5);
myset.insert(6);
myset.insert(7);
//myset.insert(7);重复会被舍弃
autofindpos =myset.find(10);
cout <<" find -> " << *findpos << " \n";
autoib =myset.begin();
autoie =myset.end();
for (;ib !=ie;ib++)
{
cout << *ib << " ";
}
cout <<"\n" <<myset.size() << endl;
cin.get();
}
案例2:
#include<iostream>
#include<set>
usingnamespacestd;
structstrless
{
//二分查找法依赖于有序,字符串有序
bool operator()(constchar *str1,constchar *str2)//二分查找法依赖于有序,字符串有序
{
returnstrcmp(str1,str2) < 0;
}
};
//红黑树,处理纯数字非常少,经常处理类对象以及字符串
voidmain()
{
constchar *cmd[] = { "abc","calc","notepad","const","xyz","ghj" };
//strless():表示比大小的
//set是一个红黑树,不可以用下标的方式
set<constchar*,strless>myset(cmd,cmd + 6,strless());
myset.insert("1234");
myset.insert("4567");
//pair起到获取插入返回值,第一个类型,类型比大小的方式
//pair相当于是一对的意思,同时可以装两个东西
pair<set<constchar *>::iterator,bool>p =myset.insert("9876");
cout <<"pair start" <<endl;
cout << *(p.first) << " " <<p.second << endl;
cout <<"pair over" <<endl;
cout <<"----正向迭代---" << endl;
autoib =myset.begin();
autoie =myset.end();
for (;ib !=ie;ib++)
{
cout << *ib << endl;
}
cout <<"----反向迭代---" << endl;
autorb =myset.rbegin();
autore =myset.rend();
for (;rb !=re;rb++)
{
cout << *rb << endl;
}
//查找
set<constchar *,strless>::iteratorpfind =myset.find("xyz");
std::cout << "\n\n\n" << *pfind << endl;
cin.get();
}
运行结果:
2. hash_set
案例1:
#include<hash_set>
#include<iostream>
#include<algorithm>
#include<string>
usingnamespacestd;
voidmain()
{
hash_set<constchar *>hs;//C++11自带子字符串的哈希
hs.insert("chian");
hs.insert("chi123an");
hs.insert("chi23an");
hs.insert("chzcian");
hs.insert("1chzcian");
//这里得到的是一个指针
autopfind =hs.find("chi23an");
if (pfind == hs.end())
{
std::cout << "没有";
}
else
{
std::cout << *pfind;
}
cin.get();
//运行结果:chi23an
}
案例2:
#include<hash_set>
#include<iostream>
#include<algorithm>
#include<string>
usingnamespacestd;
voidmain()
{
hash_set<int>hs;
hs.insert(91);
hs.insert(21);
hs.insert(41);
autoib =hs.begin();
autoie =hs.end();
for (;ib !=ie;ib++)
{
cout << *ib << endl;
}
//查找211
autopfind =hs.find(211);
if (pfind == ie)
{
std::cout << "没有";
}
else
{
std::cout << *pfind;
}
cin.get();
}
3.multiset(每个元素的节点是一个链表)
案例1:multiset与set的区别是:multiset允许重复
#include<iostream>
#include<set>
#include<stdio.h>
#include<list>
#include<vector>
#include<algorithm>
#include<functional>
usingnamespacestd;
//multiset与set的区别是允许重复
voidmain()
{
multiset<int>myset; //头文件set
myset.insert(11);
myset.insert(12);
myset.insert(13);
myset.insert(10);
myset.insert(10);
myset.insert(100);
autoib =myset.begin();
autoie =myset.end();
for (;ib !=ie;ib++)
{
std::cout << *ib <<std::endl;
printf("%p,%p\n",ib,ib._Ptr);//ib本质是智能指针
//建议使用下面的方式打印出外部指针和内部指针
printf("%p\n",ib);//ib本质是智能指针
//打印内部指针
printf("%p\n",ib._Ptr);//ib本质是智能指针
}
cin.get();
}
运行结果是:
案例2:
#define_CRT_SECURE_NO_WARNINGS
#include<set>
#include<iostream>
#include<string>
//multiset每一个节点都是一个链表,set每个节点就是一个节点
usingnamespacestd;
structstudent
{
intid;
charname[30];
};
//排序
structstuless
{
bool operator()(conststudent &s1,conststudent &s2)
{
returns1.id < s2.id;
}
};
voidmain()
{
studentsarray[3] = { { 10,"tansheng" }, { 3,"liguilong" }, { 4,"xiongfei" } };
multiset<student,stuless>myset(sarray,sarray + 3,stuless());
studentstu1;
stu1.id = 20;
strcpy(stu1.name,"mouzhiwei");
myset.insert(stu1);
strcpy(stu1.name,"mouzhiwei1");
myset.insert(stu1);
strcpy(stu1.name,"mouzhiwei2");
myset.insert(stu1);
autoib =myset.begin();
autoie =myset.end();
for (;ib !=ie;ib++)
{
cout << (*ib).id << " " << (*ib).name << endl;
}
cin.get();
}
4.hash_map
案例:
#include<hash_map>//也是红黑树,是一个映射
#include<iostream>
#include<map>
usingnamespacestd;
voidmain()
{
map<int,constchar *>m;
m.insert(pair<int,constchar *>(201,"司令1"));
m.insert(pair<int,constchar *>(101,"司"));
m.insert(pair<int,constchar *>(401,"司令11111"));
m.insert(pair<int,constchar *>(301,"司令"));
autoib =m.begin();
autoie =m.end();
for (;ib !=ie;ib++)
{
cout << (*ib).first << " " << (*ib).second << "\n";
}
std::cout << "------------" <<std::endl;
{
hash_map<int,constchar *>m;
m.insert(pair<int,constchar *>(201,"司令1"));
m.insert(pair<int,constchar *>(101,"司"));
m.insert(pair<int,constchar *>(401,"司令11111"));
m.insert(pair<int,constchar *>(301,"司令"));
std::cout << "---正向迭代---" << std::endl;
autoib =m.begin();
autoie =m.end();
for (;ib !=ie;ib++)
{
cout << (*ib).first << " " << (*ib).second << "\n";
}
autotofind =m.find(1101);
if (tofind == ie)
{
cout <<"没有找到";
}
else
{
cout <<"\n\n\n" << (*tofind).first << " " << (*tofind).second;
}
}
cin.get();
}
运行结果:
5. multimap每一个一个节点是映射的链表的开头
案例1:
#include<iostream>
#include<map>
usingnamespacestd;
//map,mutlimap区别是map每一个节点是一个映射
//multimap每一个一个节点是映射的链表的开头
voidmain()
{
map<constchar*,int>m;
m.insert(pair<constchar *,int>("司令1", 101));
m.insert(pair<constchar *,int>("司令2", 102));
m.insert(pair<constchar *,int>("司令3", 103));
m.insert(pair<constchar *,int>("司令1", 104));
map<constchar *,int>::iteratorib =m.begin();
autoie =m.end();
for (;ib !=ie;ib++)
{
cout << (*ib).first << " " << (*ib).second << "\n";
}
cin.get();
}
运行结果:
STL之红黑树容器:set,hash_set,multiset,hash_map,multimap相关推荐
- 【C++ STL学习之五】容器set和multiset
一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...
- 拒绝枯燥,用生动的例子带你学习红黑树
/ 今日科技快讯 / 2019胡润百富榜于今日(10月10日)揭晓,今年百富榜前十位的上榜门槛比去年上升100亿元,达到1200亿元.马云家族以2750亿元财富位列第一,第三次成为中国首富:马 ...
- 高性能定时器2——红黑树实现
在网络程序中我们通常要处理三种事件,网络I/O事件.信号以及定时事件,我们可以使用I/O复用系统调用(select.poll.epoll)将这三类事件进行统一处理.我们通常使用定时器来检测一个客户 ...
- 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t
新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...
- STL源码剖析 multiset 和 multimap
multiset和set完全相同,唯一的差别在于允许键值的重复,因此底层操作使用的是红黑树的insert_equal() 而不是insert_unique() multimap和map完全相同,唯一的 ...
- STL源码剖析 关联式容器 红黑树
概念 红黑树不仅仅是一个二叉树,必须满足如下条件 1,每个节点不是红色就是黑色 (深色底纹为黑色,浅色底纹为红色) 2,根节点是黑色的 3,如果节点为红,其子节点必须为黑色的 4,任一节点至NULL( ...
- STL源码剖析 关联式容器 树 红黑树、二叉搜索树、平衡二叉搜索树
所谓关联式容器,观念上类似关联式数据库(实际上则简单许多):每笔数据(每个元素)都有一个键值(key)和一个实值(value) 2.当元素被插入到关联式 容器中时,容器内部结构(可能是RB-tree, ...
- STL的红与黑--rb_tree红黑树
红黑树,作为一种广泛使用的数据结构,我想大家应该都不会陌生. 谈到红黑树的用途,最广为人知的应该就是红黑树在C++ STL中的应用了,在set, multiset, map, multimap等中,都 ...
- 红黑树实现——STL中的map
From: http://blog.csdn.net/zhongjiekangping/article/details/6934571 红黑树实现--STL中的map [ 2009-07-24 13: ...
最新文章
- 统计学习方法笔记(七)-线性支持向量机原理及python实现
- 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序...
- AngularJS:如何使用自定义指令来取代ng-repeat
- 如何更改jupyter notebook显示为中文?
- Java Spring源代码学习之how is bean scanned - did not answer when this.beanDefinitionNames is filled
- cocos2dx基础篇(24)——基本动画CCAnimation/CCAnimate
- SSDT Hook技术详解与应用
- stm32 火灾自动报警及联动控制源码_火灾自动报警与消防联动控制系统
- 需求分析岗的一般工作流程
- 设计一个H5编辑器的数据模型和核心功能
- 工作日志之Sonar扫描错误处理-Sonar扫描结果入库 java.sql.BatchUpdateException: Incorrect string value: '\xF3\xA3\xAC\xB
- 会声会影2022最新升级更新版本
- 实验9_7_设计函数int getVowel(char str[],char vowel[]);
- springboot+websocket+token验证+jedis支持集群部署发消息
- 许奔创新社-第26问:专家们创新时为何需要外行来指手画脚?
- 如何使用高扩展组件制作APP原型的标签栏?
- 对抗神经网络之对抗卷积神经网络[2]
- Xamarin移动开发的优点和缺点
- 商家如何更改拼多多上货助手价格?上货助手修改价格详细步骤
- 工作流系列: 工作流模式
热门文章
- VTK:标量条形 Actor用法实战
- VTK:vtkConnectivityFilter用法实战
- wxWidgets:wxLogFormatter类用法
- wxWidgets:wxComboBox类用法
- boost::mp11::mp_apply_q相关用法的测试程序
- boost::hana::sfinae用法的测试程序
- boost::iterator_range用法的测试程序
- GDCM:CryptographicMessageSyntax的测试程序
- Boost:mighty bimap强大的双图的测试程序
- ITK:在图像区域上运行图像过滤器