全部家底请教算法

vc_asm 2009-06-28 12:16:17
请问有什么办法产生一个没用过的整型id,并放入一个集合里,不用了就从这个集合里删除,有没有好的算法?
注意:这个id不断产生,消失,希望产生,增加到集合,从集合中移去三种操作效率高些
...全文
44 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc_asm 2009-10-28
  • 打赏
  • 举报
回复
用B*树,叶子是位mask,代码实现困难
百事烟 2009-06-29
  • 打赏
  • 举报
回复
如果是数据库序号,倒是有个笨法,让数据库这张表自动累加字段
然后写个存储过程,在行数达到一定数量时,重新计算序号,但并不清数据(只用过sql2000)
百事烟 2009-06-29
  • 打赏
  • 举报
回复
也遇过,当时没解决,呵呵
mark
luckyboy101 2009-06-29
  • 打赏
  • 举报
回复
学习。。。。
victorzou 2009-06-29
  • 打赏
  • 举报
回复
按日期时间再加随机数.
雪碧爱可乐 2009-06-28
  • 打赏
  • 举报
回复
这种情况大概是在使用数据库中生成ID时,为了有效利用曾用过的现在已无效的ID!
如果你遇到的情况跟我一样的,那么我是写了一个类来处理这个问题!
下面是类的设计,自己写实现!

class CIndexList
{
public:
CIndexList();
virtual ~CIndexList();

public:
//添加序号,这里的Append并不进行任何检查,只是单纯的把新的序号范围添加到列表的最后而已
//添加的序号不可以小于0
void Append(INT nStart, INT nEnd);

//清空内容
void Clear();

//遍历,如果列表为空的话,返回-1,相应的,添加的序号也不可以小于0
INT GetFirst();
INT GetNext();
INT GetThis();

protected:
typedef struct IndexListNode {
INT Start;
INT End;
} ILNode;
typedef std::vector<ILNode> IndexList;
}
vc_asm 2009-06-28
  • 打赏
  • 举报
回复
我考虑过guid,不过由于比较占,运算起来不方便
skyxie 2009-06-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 vc_asm 的帖子:]
请问有什么办法产生一个没用过的整型id,并放入一个集合里,不用了就从这个集合里删除,有没有好的算法?
注意:这个id不断产生,消失,希望产生,增加到集合,从集合中移去三种操作效率高些
[/Quote]

要严格保证唯一性的话,整型id不好办...
尤其是使用频率快的情况下 1 ~ 0xFFFFFFFF 溢出之后,再重新开始就重复了...

可以考虑使用GUID, 使用CoCreateGuid()生成
vc_asm 2009-06-28
  • 打赏
  • 举报
回复
是直接在内存中操作,id集合保存在内存
bdzwj 2009-06-28
  • 打赏
  • 举报
回复
unsigned int get_id()
{
static int id = 0;
return ++id;
}
如果需要保存ID,考虑用数据库或注册表记录初值
NTooL 2009-06-28
  • 打赏
  • 举报
回复
用rdtsc试试,在程序的生存期内是不会有重复的,而且就是一个汇编指令,效率高,但是他是64位的。
vc_asm 2009-06-28
  • 打赏
  • 举报
回复
vector在中间插入删除比较费

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧