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相关推荐

  1. 【C++ STL学习之五】容器set和multiset

    一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...

  2. 拒绝枯燥,用生动的例子带你学习红黑树

    /   今日科技快讯   / 2019胡润百富榜于今日(10月10日)揭晓,今年百富榜前十位的上榜门槛比去年上升100亿元,达到1200亿元.马云家族以2750亿元财富位列第一,第三次成为中国首富:马 ...

  3. 高性能定时器2——红黑树实现

    ​ 在网络程序中我们通常要处理三种事件,网络I/O事件.信号以及定时事件,我们可以使用I/O复用系统调用(select.poll.epoll)将这三类事件进行统一处理.我们通常使用定时器来检测一个客户 ...

  4. 新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t

    新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csd ...

  5. STL源码剖析 multiset 和 multimap

    multiset和set完全相同,唯一的差别在于允许键值的重复,因此底层操作使用的是红黑树的insert_equal() 而不是insert_unique() multimap和map完全相同,唯一的 ...

  6. STL源码剖析 关联式容器 红黑树

    概念 红黑树不仅仅是一个二叉树,必须满足如下条件 1,每个节点不是红色就是黑色 (深色底纹为黑色,浅色底纹为红色) 2,根节点是黑色的 3,如果节点为红,其子节点必须为黑色的 4,任一节点至NULL( ...

  7. STL源码剖析 关联式容器 树 红黑树、二叉搜索树、平衡二叉搜索树

    所谓关联式容器,观念上类似关联式数据库(实际上则简单许多):每笔数据(每个元素)都有一个键值(key)和一个实值(value) 2.当元素被插入到关联式 容器中时,容器内部结构(可能是RB-tree, ...

  8. STL的红与黑--rb_tree红黑树

    红黑树,作为一种广泛使用的数据结构,我想大家应该都不会陌生. 谈到红黑树的用途,最广为人知的应该就是红黑树在C++ STL中的应用了,在set, multiset, map, multimap等中,都 ...

  9. 红黑树实现——STL中的map

    From: http://blog.csdn.net/zhongjiekangping/article/details/6934571 红黑树实现--STL中的map [ 2009-07-24 13: ...

最新文章

  1. 统计学习方法笔记(七)-线性支持向量机原理及python实现
  2. 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序...
  3. AngularJS:如何使用自定义指令来取代ng-repeat
  4. 如何更改jupyter notebook显示为中文?
  5. Java Spring源代码学习之how is bean scanned - did not answer when this.beanDefinitionNames is filled
  6. cocos2dx基础篇(24)——基本动画CCAnimation/CCAnimate
  7. SSDT Hook技术详解与应用
  8. stm32 火灾自动报警及联动控制源码_火灾自动报警与消防联动控制系统
  9. 需求分析岗的一般工作流程
  10. 设计一个H5编辑器的数据模型和核心功能
  11. 工作日志之Sonar扫描错误处理-Sonar扫描结果入库 java.sql.BatchUpdateException: Incorrect string value: '\xF3\xA3\xAC\xB
  12. 会声会影2022最新升级更新版本
  13. 实验9_7_设计函数int getVowel(char str[],char vowel[]);
  14. springboot+websocket+token验证+jedis支持集群部署发消息
  15. 许奔创新社-第26问:专家们创新时为何需要外行来指手画脚?
  16. 如何使用高扩展组件制作APP原型的标签栏?
  17. 对抗神经网络之对抗卷积神经网络[2]
  18. Xamarin移动开发的优点和缺点
  19. 商家如何更改拼多多上货助手价格?上货助手修改价格详细步骤
  20. 工作流系列: 工作流模式

热门文章

  1. VTK:标量条形 Actor用法实战
  2. VTK:vtkConnectivityFilter用法实战
  3. wxWidgets:wxLogFormatter类用法
  4. wxWidgets:wxComboBox类用法
  5. boost::mp11::mp_apply_q相关用法的测试程序
  6. boost::hana::sfinae用法的测试程序
  7. boost::iterator_range用法的测试程序
  8. GDCM:CryptographicMessageSyntax的测试程序
  9. Boost:mighty bimap强大的双图的测试程序
  10. ITK:在图像区域上运行图像过滤器