mapallocator将元素存储在vector对象中

C++ map allocator stores items in a vector?

本文关键字:vector 对象 存储 元素 mapallocator      更新时间:2023-10-16

这是我想解决的问题:在c++中,map, multimap等的迭代器缺少两个理想的功能:(1)它们不能在运行时检查有效性,(2)没有操作符<定义的,这意味着它们不能在另一个关联容器中用作键。(我不在乎运算符><与键排序有任何关系;我只希望有一些><至少可用于同一map的迭代器)>

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

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


UPDATE 2013-06-11:我不理解回应。如果(键,数据)对存储在一个向量中,那么获得给定下标的项的时间为0(1),仅比使用直接指针的情况稍差,因此渐近性没有变化。为什么回应者说地图迭代器"没有被保留"?标准规定,只要迭代器所指向的项没有被删除,迭代器就保持有效。至于"真正的问题":假设我使用一个multimap符号表(变量名->存储位置;它是一个multimap而不是map,因为内部作用域中的变量名可能会遮蔽同名的变量),现在我需要一个由变量键控的第二个数据结构。显然,最简单的解决方案是将一个迭代器映射到第一个映射中变量名的特定实例,作为第二个映射的键,只有迭代器具有操作符<</p>

时才有效。

我不这么认为。

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

  1. inserterasefind的复杂度不再是对数。
  2. insert将不再能够保证未受影响迭代器的有效性,因为底层vector有时需要重新分配。

退一步说,有两件事让我觉得你在试图"解决"一个错误的问题。

首先,通常不需要有一个包含迭代器的vector。

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

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