用于查找无序元素的最佳STL数据结构

时间:2010-11-20 21:07:24

标签: c++ data-structures hashtable

我目前正在尝试用C ++实现哈希表作为家庭作业......

我选择使用内部链接作为表中碰撞的解决方案......

我正在寻找一个好的STL容器,它会在无序的数据集中找到特定的条目。

我不能使用基于树的stl容器(集合,地图,树等等)

现在我正在使用矢量,这是一个不错的选择吗?搜索时间是线性的,对吧?可以更好吗?

2 个答案:

答案 0 :(得分:2)

正如您所说I assume the buckets can get big...,最好使用std::list。在两种情况下搜索都是线性的,但在std::list中添加元素是不变的。

I guess they're all the same, since data isn't ordered - 不,他们不是。如果是,那就只有一个容器。每个容器都有自己的优点和缺点,不同的容器用于不同的情况。

关于vector的一些信息:

  • std::vector具有容量,这就是它具有capacity()size()方法的原因。他们都是不同的。因此,假设容量为4并且您有2个元素,那么大小将为2.因此,添加另一个元素将增加大小(将为3)并且它们都非常快。

  • 但是当你必须添加5个以上元素且容量为4时会发生什么? 全新内存已分配,所有旧元素已复制在新内存中,所有旧元素销毁(如果是用户定义的类型,则调用它们的析构函数)。然后旧记忆必须释放。如果您认为更频繁地添加/删除元素,则这些操作非常昂贵 您可以避免这种情况,使用std::vector::reserve方法提前预留一些内存,而不是一直重新分配新内存并反复复制所有内容。但是当您知道这些向量的大致大小时,这很有用。我想你不适合你的情况(保留很多内存也不是一个好的解决方案 - 你不应该浪费内存就像那样)所以,再次,我更喜欢std :: list

或双重哈希。

无论如何,这种新内存的分配和对象的复制不会经常发生,因为std::vector是“聪明的”,并且在分配新空间时,它不会仅使用1个元素或其他东西来增加容量。我认为它会翻倍,但我对此并不确定。唉,我不知道究竟是怎么用英语调用的。可能是“累积时间/记忆”或“累积复杂性”:不知道:/

注意:无论您选择什么,我建议您注意哈希函数。这是最重要的。哈希容器不应该有太多具有相同哈希的元素。所以,我的建议是搜索一个好的哈希函数,然后这不会那么重要。

希望有所帮助(:


编辑:我推荐你这篇文章 - comparing std::vector and std::deque - 它很完美 - 比较内存使用情况(分配,解除分配,增长),CPU使用情况等。我建议整个site这样的文章 - 并不多,但写得很好。

答案 1 :(得分:0)

std::tr1::unordered_set可能就是您所需要的。