这是我想要解决的问题:在C ++中,map,multimap等的迭代器缺少两个理想的特性:(1)它们无法在运行时检查有效性,(2)那里不是运营商<在它们上定义,这意味着它们不能用作另一个关联容器中的键。 (我不关心运算符<与键排序有任何关系;我只是希望有一些<至少可用于同一映射的迭代器。)
以下是此问题的可能解决方案:说服map,multimap等将其键/数据对存储在向量中,然后使迭代器成为一个小结构,其中包含指向向量本身的指针和下标索引。然后可以比较两个迭代器(至少对于同一个容器)(通过比较它们的下标索引),并且可以在运行时测试迭代器是否有效。
这个解决方案在标准C ++中是否可以实现?特别是,我可以为map类定义'Allocator'以实际将项放在向量中,然后将Allocator :: pointer类型定义为最后一段中描述的小结构吗?地图的迭代器如何与Allocator ::指针类型相关? Allocator ::指针是否必须是实际指针,还是支持解除引用操作的任何东西?
更新2013-06-11:我不理解回复。如果(键,数据)对存储在向量中,那么获得给定下标的项是O(1),只比稍微差一点,因此渐近线没有变化。为什么响应者说地图迭代器“没有被保留”?标准说只要不删除它们引用的项目,迭代器仍然有效。至于“真正的问题”:假设我使用多图表作为符号表(变量名称 - >存储位置;它是多图而不是地图,因为内部范围中的变量名称可能会影响具有相同名称的变量),并说现在我需要一个由变量键入的第二个数据结构。显然最简单的解决方案是使用第二个映射的键作为第一个映射中变量名称的特定实例的迭代器,如果只有迭代器有一个运算符<。
答案 0 :(得分:4)
我想不是。
如果您以某种方式“说服”map
将其对存储在向量中,您将从根本上改变map
上的某些(至少两个)保证:
insert
,erase
和find
在复杂性方面不再是对数。insert
将无法再保证未受影响的迭代器的有效性,因为有时需要重新分配基础vector
。退后一步,有两件事告诉我你正试图“解决”错误的问题。
首先,需要一个迭代器向量是不常见的。
其次,需要检查迭代器的有效性是不常见的,因为迭代器通常不会被保留。
我想知道真正的问题是你要解决的问题?