当前位置: 首页 > news >正文

github源码指引:共享内存、数据结构与算法:平衡二叉树set

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        相关专题:共享内存、数据结构与算法_初级代码游戏的博客-CSDN博客

        源码位置:shmfc

        基础:github源码指引:源码结构、编译、运行_github编译-CSDN博客

        承接上一篇:github源码指引:共享内存、数据结构与算法:作为基础的数组-CSDN博客

        本文介绍的T_SHMSET_NO_MUTEX基于上一篇介绍的T_ARRAY,实现平衡二叉树,尚未增加互斥功能,这两个数据结构是大部分后续数据结构的基础。

目录

一、演示代码 

二、运行演示代码


一、演示代码 

        演示代码仍位于shmfctest2.h:

class CTestT_ARRAY
{
public:struct DemoData : public CActiveObjectBase{long n = 0;sstring<8> s;//用于需要排序的场合bool operator < (CDemoData const& tmp)const { return n < tmp.n; }//某些场合也需要等于bool operator == (CDemoData const& tmp)const { return n == tmp.n; }friend ostream& operator << (ostream& o, DemoData const& d){return o << d.n << " " << d.s.c_str();}//关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的long keyhash()const { return n; }//用于输出数据的场合string& toString(string& str)const{char buf[2048];sprintf(buf, "%ld %s", n, s.c_str());return str = buf;}//用于表格输出static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table){table.AddCol("N", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);table.AddCol("S", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);return true;}bool AddTableData(CHtmlDoc::CHtmlTable2& table)const{table.AddData(n);table.AddData(s.c_str());return true;}};static int test_T_ARRAY(int argc, char** argv){T_ARRAY<DemoData, PI_TEST_1, CDemoData > a("test", 1);a.DestoryShm();if (!a.CreateShm())return __LINE__;if (!a.Attach(false))return __LINE__;for (int i = 0; i < 100; ++i){DemoData tmp;tmp.n = 10000 + i;tmp.s = "abc";T_ARRAY<DemoData, PI_TEST_1, CDemoData >::HANDLE h;a.Add(tmp, h);thelog << h.handle << endi;}for (int i = 0; i < a.Size(); ++i){string str;thelog << "第" << i << "个数据:" << a.Get(i)->toString(str) << endi;}a.RunCmdUI();return 0;}
};#include "shmSet_NoMutex.h"
class CTest_T_SHMSET_NO_MUTEX
{
public:struct DemoData : public CActiveObjectBase{long n = 0;sstring<8> s;//用于需要排序的场合bool operator < (DemoData const& tmp)const { return n < tmp.n; }//某些场合也需要等于bool operator == (DemoData const& tmp)const { return n == tmp.n; }friend ostream& operator << (ostream& o, DemoData const& d){return o << d.n << " " << d.s.c_str();}//关键字的hash值,用于分块场合,应保证hash值的最后一部分仍然是平均分布的long keyhash()const { return n; }//用于输出数据的场合string& toString(string& str)const{char buf[2048];sprintf(buf, "%ld %s", n, s.c_str());return str = buf;}//用于表格输出static bool AddTableColumns(CHtmlDoc::CHtmlTable2& table){table.AddCol("N", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);table.AddCol("S", CHtmlDoc::CHtmlDoc_DATACLASS_RIGHT);return true;}bool AddTableData(CHtmlDoc::CHtmlTable2& table)const{table.AddData(n);table.AddData(s.c_str());return true;}};static int test_T_SHMSET_NO_MUTEX(int argc, char** argv){T_SHMSET_NO_MUTEX<DemoData, PI_TEST_1, CDemoData > a("test", 1);a.DestoryShm();if (!a.CreateShm())return __LINE__;if (!a.Attach(false))return __LINE__;for (int i = 0; i < 10; ++i){DemoData tmp;tmp.n = rand() % 10;tmp.s = "abc";thelog << i << " n:" << tmp.n << " handle:" << a.insert(tmp).first.handle << endi;}for (T_SHMSET_NO_MUTEX<DemoData, PI_TEST_1, CDemoData >::const_iterator it = a.begin(); it!=a.end(); ++it){string str;thelog << it->toString(str) << endi;}for (int i = 0; i < 10; ++i){DemoData tmp;tmp.n = i;T_SHMSET_NO_MUTEX<DemoData, PI_TEST_1, CDemoData >::const_iterator it = a.find(tmp);string str;if(it!=a.end())thelog << i << " 找到 handle:" << it.handle <<" "<<it->toString(str) << endi;else thelog << i << " 没找到 handle:" << it.handle << endi;}a.RunCmdUI();return 0;}
};

        代码和T_ARRAY的测试代码非常相似,前面定义的DemoData其实是一样的(除了operator<参数名改了一下,因为T_ARRAY没有用到这个函数,所以之前没有发现错误)。

        测试代码同样是创建共享内存、操作数据,最后进入RunCmdUI。

        代码演示了与STL的set相似的insert、iterator遍历和find。

二、运行演示代码

        命令21运行这个演示代码:

----------------------------------------
命令表:(q=exit)
0 管理
1 test_BinaryPool
3 test_CMultiProcessServer
4 test_CMultiProcessServer_view
5 test_CMultiProcessServer_speed
6 test_CMultiProcessServer_direct
7 test_RebuildSet
12 UDP测试客户端
13 UDP测试服务端
14 CStressTesting
15 CTestCSimpleMultiProcess_mutex atomic
16 CTest_hash
17 T_SHM_HASH
20 T_ARRAY
21 T_SHMSET_NO_MUTEX
88 test_CMyRWMutex
89 test_T_SHM_SET_GROUP
90 test_shm_IActiveObject
91 test_ShmMultiMap
99 test_ParseFromXml
........................................
----------------------------------------
请选择命令:(q=exit default=21):[08-28 15:46:00][应用][信息] 用户输入的是:21
[08-28 15:46:00][应用][信息][shmArray.h              : 960(AttachToShm)][  0.00]test 连接共享内存成功 PI_N 1 PART 0 shmid = 98306 p 0x7ffade5d0000
[08-28 15:46:00][应用][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.00]未配置 SHM_CONFIG default.test
[08-28 15:46:00][应用][出错][shmEnv.h                : 304(GetRegFromDb)][  0.00]共享内存 default test 0 不存在,可能的原因:主机重启或手工删除
[08-28 15:46:00][应用][信息][shmArray.h              :1024(_DestoryShm)][  0.00]test 0 连接到共享内存失败
[08-28 15:46:00][应用][信息][shmEnv.cpp              : 624(GetShmConfig)][  0.00]未配置 SHM_CONFIG default.test
[08-28 15:46:00][应用][信息][shmArray.h              :1074(_CreateShm)][  0.00]default test 0 未配置的最大记录数
[08-28 15:46:00][应用][信息][shmArray.h              :1076(_CreateShm)][  0.00]使用默认值 1024
[08-28 15:46:00][应用][信息][shmArray.h              : 395(_CreateShmIfNeed)][  0.00]创建新共享内存成功,id = 131074
[08-28 15:46:00][应用][信息][shmArray.h              :1129(_CreateShm)][  0.00]基础共享内存创建完成
[08-28 15:46:00][应用][信息][shmArray.h              : 960(AttachToShm)][  0.00]test 连接共享内存成功 PI_N 1 PART 0 shmid = 131074 p 0x7ffade5d0000
[08-28 15:46:00][应用][信息][shmSet_NoMutex.h        :1414(set_CreateShm)][  0.00]数据结构构造成功
[08-28 15:46:00][应用][信息][shmSet_NoMutex.h        :1416(set_CreateShm)][  0.00]创建成功
[08-28 15:46:00][应用][信息][shmArray.h              : 960(AttachToShm)][  0.00]test 连接共享内存成功 PI_N 1 PART 0 shmid = 131074 p 0x7ffade5d0000
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]0 n:3 handle:0
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]1 n:6 handle:1
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]2 n:7 handle:2
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]3 n:5 handle:3
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]4 n:3 handle:0
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]5 n:5 handle:3
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]6 n:6 handle:1
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]7 n:2 handle:4
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]8 n:9 handle:5
[08-28 15:46:00][应用][信息][shmfctest2.h            : 135(test_T_SHMSET_NO_MUTEX)][  0.00]9 n:1 handle:6
[08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]1 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]2 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]3 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]5 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]6 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]7 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 140(test_T_SHMSET_NO_MUTEX)][  0.00]9 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 149(test_T_SHMSET_NO_MUTEX)][  0.00]0 没找到 handle:-1
[08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]1 找到 handle:6 1 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]2 找到 handle:4 2 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]3 找到 handle:0 3 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 149(test_T_SHMSET_NO_MUTEX)][  0.00]4 没找到 handle:-1
[08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]5 找到 handle:3 5 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]6 找到 handle:1 6 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]7 找到 handle:2 7 abc
[08-28 15:46:00][应用][信息][shmfctest2.h            : 149(test_T_SHMSET_NO_MUTEX)][  0.00]8 没找到 handle:-1
[08-28 15:46:00][应用][信息][shmfctest2.h            : 148(test_T_SHMSET_NO_MUTEX)][  0.00]9 找到 handle:5 9 abc
[08-28 15:46:00][应用][信息][shmIActiveObject.h      : 457(RunCmdUI)][  0.00]
testb:返回上一层
1:创建 2:连接(只读) 3:连接(可写) 4:断开 5:禁用互斥 6:清除数据 7:创建私有 8:删除共享内存 9:显示 10:数据
11:从数据库加载 12:保存到数据库
21:从目录加载 22:保存到目录 23:导出为文本文件
31:从目录加载到私有内存 32:销毁私有内存
97:repair 98:check 99:ToDo 100:shell(q=exit ):

        注意,因为插入的数据是随机的,所以一定有几个因为重复而覆盖(STL的标准行为是不覆盖,set里面只有key,但是因为我们实际的使用习惯是key后面附带了很多属性,这些属性是需要覆盖的,所以这里是覆盖的,如果把数据s设置成跟随n变化就可以看出这一点)。

        排序规则由operator<决定,但实际上是由T_SHMSET_NO_MUTEX的模板参数“typename T_COMP = less<T_DATA>”决定的。less的默认实现是使用operator<。

        还有几个功能没有演示:

  • erase 删除
  • lower_bound 符合STL语义的,参数需要提供比较函数,比较函数必须是排序规则的一部分,否则结果是不可预期的
  • upper_bound 类似。这两个不属于set的标准,但是实际场景下非常有用,数据可能是按照a.b.c排序的,实际操作经常是处理所有a的数据或a.b的数据

        结合代码很容易使用这些功能。

        这个模板类之下有好几个处理互斥和分组的类型,都是继承自本类型。


(这里是文档结束)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PHP与Nginx配置优化:深入探讨Socket通信
  • ffmpeg音视频开发从入门到精通——ffmpeg实现音频抽取
  • 【HuggingFace Transformers】OpenAIGPTModel的核心——Block源码解析
  • Unity数据持久化 之 向文件流读写(详细Plus版)
  • stdin getc() getchar()
  • js逆向--绕过debugger(一)
  • 欢迎大家评论讨论set_input_transition对path delay的影响
  • HarmonyOS开发实战( Beta5版)Stack组件实现滚动吸顶效果实现案例
  • 前端登录鉴权——以若依Ruoyi前后端分离项目为例解读
  • 单点登录SSO
  • 大模型推理框架 RTP-LLM 架构解析
  • 《LeetCode 热题 100》
  • 人机环境系统智能与Petri网
  • kubeadm方式升级k8s集群
  • SprinBoot+Vue校园活动报名微信小程序的设计与实现
  • 【comparator, comparable】小总结
  • 2017 年终总结 —— 在路上
  • CentOS从零开始部署Nodejs项目
  • JavaScript设计模式系列一:工厂模式
  • mysql 数据库四种事务隔离级别
  • Netty 4.1 源代码学习:线程模型
  • Next.js之基础概念(二)
  • SQLServer之创建显式事务
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vultr 教程目录
  • 阿里云应用高可用服务公测发布
  • 成为一名优秀的Developer的书单
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 利用DataURL技术在网页上显示图片
  • 强力优化Rancher k8s中国区的使用体验
  • 全栈开发——Linux
  • 一份游戏开发学习路线
  • ionic入门之数据绑定显示-1
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 数据可视化之下发图实践
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # 飞书APP集成平台-数字化落地
  • #android不同版本废弃api,新api。
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (C++17) optional的使用
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (二)换源+apt-get基础配置+搜狗拼音
  • (离散数学)逻辑连接词
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)Dubbo快速入门、介绍、使用
  • (一)Thymeleaf用法——Thymeleaf简介
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 物件導向與老子思想 (OO)
  • (转)visual stdio 书签功能介绍
  • (转)四层和七层负载均衡的区别