C++ 分配唯一ID';类的每个实例

C++ 分配唯一ID';类的每个实例,c++,xml,algorithm,C++,Xml,Algorithm,我正在从XML文件导入项目。每个XML元素(FoodItem,Person,Order,CoffeeRun)都是一个类&这些元素中的每一个都有一个唯一的ID(该类的唯一ID) 一个向量是以每bool一位的方式实现的,因此它不会像您假设的那样浪费空间 set是解决这个问题的简单方法。向量更快。两者都需要一点内存。根据您的使用模式,还有一些其他解决方案: 一个unsigned int all(无符号整数)取到这个与集合相结合覆盖所有高于此集合的所有古怪ID-从集合中移除并在可能的情况下增加计数器

我正在从XML文件导入项目。每个XML元素(
FoodItem
Person
Order
CoffeeRun
)都是一个类&这些元素中的每一个都有一个唯一的ID(该类的唯一ID)

一个
向量
是以每bool一位的方式实现的,因此它不会像您假设的那样浪费空间

set
是解决这个问题的简单方法。
向量
更快。两者都需要一点内存。根据您的使用模式,还有一些其他解决方案:

  • 一个
    unsigned int all(无符号整数)取到这个
    集合相结合
    覆盖所有高于
    此集合的所有古怪ID
    -从集合中移除并在可能的情况下增加计数器

  • 一种
    映射
    ,逻辑上被视为获取序列或自由序列的
    开始、结束
    。这需要一点修改才能正确实现(例如,在两个元素之间添加最后一个ID时合并连续的贴图元素)

您可能会使用预制的“稀疏位集”类型的数据结构-我不知道有什么实现方法。

a
vector
是以每布尔一位的方式实现的,因此它不会像您假设的那样浪费太多空间

set
是解决这个问题的简单方法。
向量
更快。两者都需要一点内存。根据您的使用模式,还有一些其他解决方案:

  • 一个
    unsigned int all(无符号整数)取到这个
    集合相结合
    覆盖所有高于
    此集合的所有古怪ID
    -从集合中移除并在可能的情况下增加计数器

  • 一种
    映射
    ,逻辑上被视为获取序列或自由序列的
    开始、结束
    。这需要一点修改才能正确实现(例如,在两个元素之间添加最后一个ID时合并连续的贴图元素)


你可能会使用一个预先制作的“稀疏比特集”类型的数据结构——我不知道任何实现Otoh。< /P> < P>取决于元素的数量和其他一些问题,你可以考虑在地图中实际存储它们(或者至少指向它们)。实现起来相当简单,但需要一些空间。另一方面,它将通过

id
提供快速查找,如果XML中存在交叉引用,这可能是一个明显的优势。映射(假设指针)如下所示:

std::map<int, std::shared_ptr<Object> > id_map;
std::shared_ptr<Object> p( new Object( xml ) );
if ( !id_map.insert( std::make_pair( p->id, p ) ).second ) {
   // failed to insert, the element is a duplicate!!!
} 
std::map id\u map;
std::shared_ptr p(新对象(xml));
if(!id_map.insert(std::make_pair(p->id,p)).second){
//插入失败,元素是重复的!!!
} 

取决于元素的数量和其他几个问题,您可以考虑在地图中实际存储它们(或者至少指向它们)。实现起来相当简单,但需要一些空间。另一方面,它将通过

id
提供快速查找,如果XML中存在交叉引用,这可能是一个明显的优势。映射(假设指针)如下所示:

std::map<int, std::shared_ptr<Object> > id_map;
std::shared_ptr<Object> p( new Object( xml ) );
if ( !id_map.insert( std::make_pair( p->id, p ) ).second ) {
   // failed to insert, the element is a duplicate!!!
} 
std::map id\u map;
std::shared_ptr p(新对象(xml));
if(!id_map.insert(std::make_pair(p->id,p)).second){
//插入失败,元素是重复的!!!
} 

如果您没有被限制使用整数,您可以查看GUID(全局唯一ID)。根据您使用的平台,通常可以找到几个实用程序函数来动态生成GUID。如果使用Visual Studio,我已经使用了该函数


如果锁定为32位整数,另一个选项是哈希表。如果每个XML元素都是唯一的,则哈希函数可以生成唯一的哈希值。根据数据集的大小,碰撞的可能性仍然很小。我使用的一个与我使用过的数据集的冲突率似乎很低,它被称为

,如果您不使用整数,您可以查看guid(全局唯一id)。根据您使用的平台,通常可以找到几个实用程序函数来动态生成GUID。如果使用Visual Studio,我已经使用了该函数


如果锁定为32位整数,另一个选项是哈希表。如果每个XML元素都是唯一的,则哈希函数可以生成唯一的哈希值。根据数据集的大小,碰撞的可能性仍然很小。我使用的一个与我使用的数据集的冲突率似乎很低,它被称为

。。UM不是C++中的一个字节变量,一个字节不是比特吗?你在想std::bitset吗?@Mack:不,我在想的是标准指定的
vector
专门化的可怕的憎恶,它打破了一系列语义,却没有提供像bitset这样更好的替代品所不能提供的任何东西。(是的,这是一个令人讨厌的-我真的不喜欢
vector
)@Mack,虽然添加它的人对它感到遗憾,
std::vector
不是一个包含
bool
对象的
std::vector
,而是一种特殊化,其中每个元素只占用一位内存。遗憾的是,您无法像其他向量那样提供对元素的直接访问,因此即使看起来相同,它的行为也会有所不同(这可以通过返回代理对象来解决,代理对象修改原始向量中的适当位,因为您不能有一个指向位的指针/引用)@David:作为旁注,读了你的评论后,我突然意识到,多年来我一直在错误地写“性病::”而不是“性病::”。。。谢谢:PBWare:我不是以英语为母语的人,这可能是任何一种方式,我都不会知道。直到几天前,我还确信模板参数是可以扣除的,但后来税就被扣除了
std::map<int, std::shared_ptr<Object> > id_map;
std::shared_ptr<Object> p( new Object( xml ) );
if ( !id_map.insert( std::make_pair( p->id, p ) ).second ) {
   // failed to insert, the element is a duplicate!!!
}