动态数组宽度id?

时间:2011-07-27 15:06:05

标签: c++ vector hashtable dynamic-arrays

我需要在C ++中使用某种动态数组,其中每个元素都有自己的id,由int表示。

数据类型需要以下功能:

  • int Insert() - 返回ID
  • 删除(int ID)
  • 获取(ID) - 返回元素

我应该使用什么数据类型?我看过Vector和List,但似乎无法找到任何类型的ID。我也看了看地图和hastable,这些可能很有用。我不知道该选什么。

4 个答案:

答案 0 :(得分:2)

我可能会使用向量和空闲id列表来处理删除,然后索引就是id。插入和获取非常快,并且相当容易管理(唯一的技巧是删除项目的空闲列表)。

否则你可能想要使用地图,只记录最低的未使用的id,并在插入时分配它。

答案 1 :(得分:1)

似乎最好使用的容器是unordered_map。 它基于哈希。您可以在O(n)中插入,删除或搜索元素。

目前unordered_map不在STL中。如果要使用STL容器,请使用std :: map。 它基于树。在O(n * log(n))中插入,删除和搜索元素。

容器的选择在很大程度上取决于使用强度。例如,如果你找到稀有的元素,vector和list就可以了。这些容器没有find方法,但<algorithm>库包含它。

答案 2 :(得分:1)

std::map可能对您有用,它允许将键与值相关联。 将是您的ID,但您应该在向地图添加元素时自行提供。

哈希表是一种可用于实现无序映射的基本机制。它对应于std :: unordered_map。

答案 3 :(得分:1)

vector给出恒定时间随机访问,“id”可以简单地是向量中的偏移量(索引)。 deque类似,但不会连续存储所有项目。

如果ID值可以从0开始(或者从0开始的已知偏移量并且单调递增),则这些中的任何一个都是合适的。随着时间的推移,如果有大量删除,vectordeque可能会变得稀疏,这可能是有害的。

std::map没有人口稀少的问题,但是查找从常数时间变为对数时间,这可能会影响性能。

boost::unordered_map可能是最好的,因为作为哈希表的最佳情况可能会在给定问题时具有最佳的整体性能特征。但是,可能需要使用boost库 - 但如果在STL实现中可用,unordered中也有std::tr1个容器类型。