C++;地图分配器将项目存储在向量中? 这是我想解决的问题:在C++中,map、MultIAP等迭代器缺少两个理想的特征:(1)它们不能在运行时检查以获得有效性,(2)在它们上没有定义操作符,这意味着它们不能作为另一个关联容器中的密钥使用。(我不关心操作符

C++;地图分配器将项目存储在向量中? 这是我想解决的问题:在C++中,map、MultIAP等迭代器缺少两个理想的特征:(1)它们不能在运行时检查以获得有效性,(2)在它们上没有定义操作符,这意味着它们不能作为另一个关联容器中的密钥使用。(我不关心操作符,c++,iterator,allocator,C++,Iterator,Allocator,这个问题有一个可能的解决方案:说服map、multimap等将它们的密钥/数据对存储在一个向量中,然后让迭代器成为一个小结构,其中包含指向向量本身的指针和一个下标索引。然后可以比较两个迭代器(至少对于同一个容器),通过比较它们的下标索引,可以在运行时测试迭代器是否有效 这个解决方案是在标准C++中实现的吗?特别是,我可以为map类定义“分配器”以实际将项放入向量中,然后将分配器::指针类型定义为上一段中描述的小结构吗?映射的迭代器如何与分配器::指针类型相关?分配器::指针必须是实际的指针,还是

这个问题有一个可能的解决方案:说服map、multimap等将它们的密钥/数据对存储在一个向量中,然后让迭代器成为一个小结构,其中包含指向向量本身的指针和一个下标索引。然后可以比较两个迭代器(至少对于同一个容器),通过比较它们的下标索引,可以在运行时测试迭代器是否有效

这个解决方案是在标准C++中实现的吗?特别是,我可以为map类定义“分配器”以实际将项放入向量中,然后将分配器::指针类型定义为上一段中描述的小结构吗?映射的迭代器如何与分配器::指针类型相关?分配器::指针必须是实际的指针,还是可以是任何支持取消引用操作的指针


更新2013-06-11:我不理解这些回答。如果(键,数据)对存储在一个向量中,那么获得给定下标的项是O(1),只比使用直接指针稍微差一点,因此渐近性没有变化。为什么响应者说映射迭代器“不存在”?该标准规定,只要迭代器引用的项没有被删除,迭代器就仍然有效。至于“真正的问题”:假设我对符号表使用多重映射(变量名->存储位置;它是多重映射而不是映射,因为内部作用域中的变量名可能会对同名的变量进行阴影处理),然后说现在我需要由变量设置键的第二个数据结构。显然最简单的解决方案是使用迭代器作为第二个映射的键,将其映射到第一个映射中变量名称的特定实例,如果迭代器只有一个操作符就可以了

如果您能够以某种方式“说服”
map
将其对存储在一个向量中,您将从根本上改变
map
上的某些(至少两个)保证:

  • 插入
    删除
    查找
    的复杂性将不再是对数
  • insert
    将不再能够保证未受影响迭代器的有效性,因为底层的
    向量
    有时需要重新分配
  • 退一步说,有两件事向我表明你试图“解决”错误的问题

    首先,需要一个迭代器向量是不常见的

    第二,需要检查迭代器的有效性是不常见的,因为迭代器通常不存在

    我想知道你想解决的真正问题是什么?

    我想不是

    如果您能够以某种方式“说服”
    map
    将其对存储在一个向量中,您将从根本上改变
    map
    上的某些(至少两个)保证:

  • 插入
    删除
    查找
    的复杂性将不再是对数
  • insert
    将不再能够保证未受影响迭代器的有效性,因为底层的
    向量
    有时需要重新分配
  • 退一步说,有两件事向我表明你试图“解决”错误的问题

    首先,需要一个迭代器向量是不常见的

    第二,需要检查迭代器的有效性是不常见的,因为迭代器通常不存在


    我想知道您试图解决的真正问题是什么?

    如果您这样做,您将失去在O(logn)时间内插入和删除元素的能力,这是
    std::map
    和朋友所必需的。您可以为地图使用自定义比较函数。您想要解决的真正问题是什么?如果您这样做,您失去了在O(logn)时间内插入和删除元素的能力,这是
    std::map
    和friends所必需的。您可以对地图使用自定义比较函数。您想要解决的真正问题是什么?