当前位置:编程学习 > C/C++ >>

关于数据类型未知或者将会不断增加的解决方案

有时侯会面临未来不知数据会有多少变数的问题, 而把所以变数一次性全部写上, 或者在面临变数时,不断修改类源码以扩充新的数据记录显然不是一个好方法. 这时侯,可以采用索引+绑定方式解决: 类源码的数据只有一个用于区分事物的uid(索引用), 然后在后续的模块中,需要扩展新的数据,则对这个uid进行各类绑定. 这样,新增的数据需求不会修改到旧有的数据需求.

 

[cpp]
function get_t_set_by_i( _t ) 
    if nil == _t then 
        return _t 
    end 
    local t = {} 
    for i,v in pairs(_t) do 
        t[table.getn(t) + 1] = i 
    end 
    return t 
end 
 
function get_t_set_by_v( _t ) 
    if nil == _t then 
        return _t 
    end 
    local t = {} 
    for i,v in pairs(_t) do 
        t[table.getn(t) + 1] = v 
    end 
    return t 
end 
 
function myPrint(_x, _y) 
    print(_x) 
end 
 
function get_valid_t( _t ) 
    local t = {} 
    local len = table.getn(_t) 
    for i=1, len do 
        if nil ~= _t[i] then 
            t[ table.getn(t) + 1] = _t[i] 
        end 
    end 
    return t 
end 
 
 
--------------------------------------------- 索引 -------------------------------------------- 
--索引管理 
function new_index_manager() 
    local t_index = {} 
    local public = {} 
    --创建索引 
    function public.create_index() 
        for i=1, 9999999 do 
            if nil == t_index[i] then 
                t_index[i] = 1 
                return i 
            end 
        end 
        myPrint("索引资源用尽", 1) 
        return nil 
    end 
    --索引是否有效 
    function public.is_valid_index( _index ) 
        if nil ~= t_index[_index] then 
            return true 
        end 
        return false 
    end 
    --删除索引 
    function public.delete_index( _index ) 
        t_index[_index] = nil 
    end 
    return public 
end 
G_FB_Buf_Index = new_index_manager() 
 
--1:N绑定器 
function new_map_for_1_and_N() 
    local left_set = {} 
    local right_set = {} 
    local public = {} 
    --绑定索引和UID( 1:N ) 
    function public.bind_left_and_right( _left, _right ) 
        if nil == left_set[_left] then 
            left_set[_left] = {} 
        end 
        local len = table.getn(left_set[_left]) 
        for i=1, len do 
            if left_set[_left][i] == _right then 
                return 
            end 
        end 
        left_set[_left][table.getn(left_set[_left])+1] = _right 
        right_set[_right] = _left 
    end 
    --清除绑定 
    function public.clear_left_and_right( _left ) 
        local t_right = public.get_t_map_by_fb_buf_index( _left ) 
        local len = table.getn( t_right ) 
        for i=1, len do 
            right_set[ t_right[i] ] = nil 
        end 
        left_set[_left] = nil 
    end 
    --清除绑定 
    function public.clear_right( _left, _right ) 
        right_set[_right] = nil 
        local t_right = left_set[_left] 
        local len = table.getn( t_right ) 
        for i=1, len do 
            if t_right[i] == _right then 
                t_right[i] = nil 
            end 
        end 
    end 
    --通过left获得rigth表 
    function public.get_t_right_by_left( _left ) 
        return get_valid_t( left_set[_left] ) 
    end 
    --通过right获得left 
    function public.get_left_by_right( _right ) 
        return right_set[ _right ] 
    end 
    return public 
end 
 
--buf绑定器 
function new_map_for_index_to_buf() 
    local index_set = {} 
    local public = {} 
    --绑定buf 
    function public.bind_index_to_buf( _index, _buf ) 
        index_set[ _index ] = _buf 
    end 
    --清除绑定 
    function public.clear_index_to_buf( _index ) 
        index_set[_index] = nil 
    en

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,