勿忘初心做自己 发表于 2024-9-5 13:34:39

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;
                        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;
                        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):

[应用][信息] 用户输入的是:21
[应用][信息]test 连接共享内存成功 PI_N 1 PART 0 shmid = 98306 p 0x7ffade5d0000
[应用][信息]未配置 SHM_CONFIG default.test
[应用][出错]共享内存 default test 0 不存在,可能的原因:主机重启或手工删除
[应用][信息]test 0 连接到共享内存失败
[应用][信息]未配置 SHM_CONFIG default.test
[应用][信息]default test 0 未配置的最大记录数
[应用][信息]使用默认值 1024
[应用][信息]创建新共享内存成功,id = 131074
[应用][信息]基础共享内存创建完成
[应用][信息]test 连接共享内存成功 PI_N 1 PART 0 shmid = 131074 p 0x7ffade5d0000
[应用][信息]数据结构构造成功
[应用][信息]创建成功
[应用][信息]test 连接共享内存成功 PI_N 1 PART 0 shmid = 131074 p 0x7ffade5d0000
[应用][信息]0 n:3 handle:0
[应用][信息]1 n:6 handle:1
[应用][信息]2 n:7 handle:2
[应用][信息]3 n:5 handle:3
[应用][信息]4 n:3 handle:0
[应用][信息]5 n:5 handle:3
[应用][信息]6 n:6 handle:1
[应用][信息]7 n:2 handle:4
[应用][信息]8 n:9 handle:5
[应用][信息]9 n:1 handle:6
[应用][信息]1 abc
[应用][信息]2 abc
[应用][信息]3 abc
[应用][信息]5 abc
[应用][信息]6 abc
[应用][信息]7 abc
[应用][信息]9 abc
[应用][信息]0 没找到 handle:-1
[应用][信息]1 找到 handle:6 1 abc
[应用][信息]2 找到 handle:4 2 abc
[应用][信息]3 找到 handle:0 3 abc
[应用][信息]4 没找到 handle:-1
[应用][信息]5 找到 handle:3 5 abc
[应用][信息]6 找到 handle:1 6 abc
[应用][信息]7 找到 handle:2 7 abc
[应用][信息]8 没找到 handle:-1
[应用][信息]9 找到 handle:5 9 abc
[应用][信息]
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的数据
        联合代码很容易利用这些功能。
        这个模板类之下有好几个处理互斥和分组的范例,都是继续自本范例。
(这里是文档结束)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: github源码指引:共享内存、数据结构与算法:平衡二叉树set