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

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

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

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


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

源码位置:shmfc

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

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

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

目录

一、演示代码

二、运行演示代码


一、演示代码

演示代码仍位于shmfctest2.h:

cpp 复制代码
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运行这个演示代码:

cpp 复制代码
----------------------------------------
命令表:(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]
test

b:返回上一层
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的数据

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

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


(这里是文档结束)

相关推荐
A洛3 小时前
Cloudflare Pages 部署 Next.js 应用教程
开发语言·github·nextjs·cloudflare·cloudflarepages
bigbig猩猩21 小时前
GitHub上克隆项目
github
落难Coder1 天前
为你的 Github 仓库引入自动构建的Github Pages静态页面
github
shiming88792 天前
GitHub上克隆项目
github
小程爱敲代码2 天前
github远程仓库环境搭建及使用
github
绘绘~2 天前
PDF扫描版文字识别OCR
pdf·开源·github·ocr
stormsha2 天前
github高级搜索
github
程序员-杨胡广3 天前
Redis重要知识点:哨兵是什么?哨兵如何选择Redis主服务器
redis·git·bootstrap·github
马卫斌 前端工程师3 天前
如何从github上clone项目
github
代码之光_19803 天前
Spring Boot校园管理系统:技术选型与架构设计
spring boot·后端·github