使用以插入方式排序的参数创建哈希映射

时间:2018-01-15 09:21:55

标签: c++ hashmap hash-function

我想更改std :: map(它的散列函数),所以当迭代以插入它们的方式返回对时。我尝试过无序地图,但没有成功。所以我想我必须创建一个递增的哈希函数,并且每次都返回更大的值。我怎样才能做到这一点?我不是在处理大数据,因此性能不是问题。

2 个答案:

答案 0 :(得分:3)

听起来你想要一个有序的映射,一个允许O(1)查找的哈希映射,但是记住插入的顺序(对于迭代顺序)。幸运的是,C ++中存在一种有效的实现: https://github.com/Tessil/ordered-map

自述文件的一个例子是:

.reload

您也可以像Python的有序地图一样实现它,它使用链接列表来跟踪插入顺序。一个优点是更有效的删除(Tessil的有序映射有[l+, l- (Set Source Options)][1] 个删除,而链表/映射是平均#include <iostream> #include <tsl/ordered_map.h> int main() { tsl::ordered_map<char, int> map = {{'d', 1}, {'a', 2}, {'g', 3}}; map.insert({'b', 4}); map['h'] = 5; map['e'] = 6; map.erase('a'); // {d, 1} {g, 3} {b, 4} {h, 5} {e, 6} for(const auto& key_value : map) { std::cout << "{" << key_value.first << ", " << key_value.second << "}" << std::endl; } return 0; } )。假设映射通常存储类型为O(n)的键/值类型,则将O(1)存储在链表中,并将迭代器存储为内部unordered_map的值类型。然后,您将包装类和任何迭代器,以确保它像普通的hashmap一样从外部起作用。

基本大纲看起来如下所示(如果Key, T删除是不可接受的,则其余部分供您实施)。使用列表是因为它们在删除元素时不会使迭代器无效,并且映射用于按键查找正确的列表迭代器以进行删除。满足所有大O问题,尽管有一些开销。

T

答案 1 :(得分:0)

我认为最好使用:

std::vector<std::pair<key,value> myValues

对于插入,您可以使用此类代码

myValues.emplace_back(std::make_pair<key,value>(someKey, someValue));

最好是循环执行此操作。然后,当你想要按顺序获取项目时,你只需循环索引例如使用基于范围的循环输出元素按顺序输入:

for(auto & pair : myValues) { std::cout << "Key: " << pair.first << " Value: " << pair.second << std::endl; }

在unordered_map或常规地图容器上执行此操作将是此类容器的不良用例。