- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我了解 unordered_
STL 容器保留多个桶,桶的数量根据容器中元素的数量而变化。插入时,如果超过一定的限制,容器将重新散列以使用更多的桶,因此每个桶都不太满并且搜索速度更快。这会使迭代器无效。
这意味着我不应该将迭代器保存到一个unordered
容器中。除了我可以,如果我在重新哈希后更新它们。但是我找不到可靠的方法来检查 insert
(无论是 emplace
还是其他)是否导致了重新哈希。
我应该监控 bucket_count()
吗?
cppreference表示 只有当新的元素数量大于 max_load_factor()*bucket_count()
时才会发生重新散列。那是有保证的吗?这样做靠谱吗?
bool will_rehash = (max_load_factor()*bucket_count()) > size()+1;
最佳答案
我不认为一旦 hash-map 增长就会发生重新散列(作为实际参与散列函数的过程):
这意味着,可以监视存储桶计数以推断迭代器是否应该失效(假定失效发生在重新存储桶的那一刻)
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
typedef unordered_map<string, string> str_map;
struct my_hash {
void reset(void) { calls_ = 0; }
size_t calls(void) { return calls_; }
size_t operator()(const string& key) const {
++my_hash::calls_;
return hash_fn_(key);
}
private:
str_map native_hash_fn_;
str_map::hasher hash_fn_{native_hash_fn_.hash_function()};
static size_t calls_;
};
size_t my_hash::calls_ = 0;
int main ()
{
typedef unordered_map<string, string, my_hash> myMapType;
myMapType mymap(1, my_hash());
myMapType::hasher hash = mymap.hash_function();
cout << "mymap has " << mymap.bucket_count() << " buckets" << endl;
mymap["abc1"] = "blah"; // add 3 values
mymap["abc2"] = "blah"; // just to see the hash calls tracking
mymap["abc3"] = "blah"; // is working
cout << "hash calls: " << hash.calls() << endl;
hash.reset();
for(size_t i=0; i < 10; ++i) {
mymap[to_string(i)] = "blah";
cout << "buckets: " << mymap.bucket_count() << endl;
cout << "hash calls: " << hash.calls() << endl;
hash.reset();
}
cout << "mymap has " << mymap.bucket_count() << " buckets" << endl;
}
输出:
mymap has 2 buckets
hash calls: 3
buckets: 5
hash calls: 1
buckets: 11
hash calls: 1
buckets: 11
hash calls: 1
buckets: 11
hash calls: 1
buckets: 11
hash calls: 1
buckets: 11
hash calls: 1
buckets: 11
hash calls: 1
buckets: 23
hash calls: 1
buckets: 23
hash calls: 1
buckets: 23
hash calls: 1
mymap has 23 buckets
免责声明:不过,我坚信在容器大小发生变化后引用迭代器并不是一个好的编程习惯。即使它可能不会导致某些致命的/未定义的行为,它也可能(而且很可能会)对编程逻辑造成一些副作用。对于散列映射,请考虑使用 begin()
迭代器的情况:在几次插入/放置之后,它将不再是真正的 begin
。即使没有发生重新分桶,一些新条目也可能会安装在它前面(这可能会影响编程逻辑)。
关于c++ - 我如何知道 `rehash` 是否发生在我插入 unordered_map 之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55974693/
在某些时候我们需要增加散列的大小,通常我们只是重新散列,这会导致整个散列的重新构造。 有没有更好的解决方案,当我们增加尺寸时,我们不需要重新构造整个东西? 最佳答案 你可以使用 http://en.w
我正在实现一个哈希表,而不使用任何内置的 java HashTable 功能,并收到以下行的编译时错误: newHashTable.add(reHashValueIndex, bucket.get(j
我们有一个运行着多个数据库的 MySQL 服务器,用于不同类型的数据。其中之一是 wordpress 数据库。 我可以连接正常,“显示数据库”,“使用苹果”,“使用橙子”等(用水果代替我们的实际数据库
HashMap 的文档中有这样的短语: If the initial capacity is greater than the maximum number of entries divided by
我正在使用Kibana 4在ElasticSearch上查询唯一计数。 我想prevent rehash on field,,因为该字段已经被散列了。 如何使Kibana使用"rehash": fal
我对散列和重新散列有些困惑。以下是我的理解,如有错误请指正。 从图片上看,bucket实际上是Entry类的数组,以链表的形式存储元素。每个新的键值对,其键具有与条目数组桶相同的哈希码,将作为条目对象
我不明白为什么 hastable 的 rehash 复杂度在最坏的情况下可能是二次的: http://www.cplusplus.com/reference/unordered_set/unorder
我了解 unordered_ STL 容器保留多个桶,桶的数量根据容器中元素的数量而变化。插入时,如果超过一定的限制,容器将重新散列以使用更多的桶,因此每个桶都不太满并且搜索速度更快。这会使迭代器无效
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwa
我们的数据库有很多表和很多列。命令行 mysql 客户端需要很长时间才能连接,除非我通过它 -A。我不想每次都输入它,所以我尝试添加 my.cnf 选项 no-auto-rehash。 在我必须使用
我试图让我的 Ruby 1.9.3 运行我的 Octopress 安装。 当我输入时: rbenv rehash 我遇到了一个错误: rbenv: cannot rehash: /Users/m
C++ unordered_map 的rehash() 和reserve() 方法有什么区别?为什么需要两种不同的方法? 最佳答案 区别在于目的,尽管两者都在做类似的事情。 rehash 获取现有映射
我不明白为什么它不是线性的。 关于多重集的类似问题有一个很好的答案: why hastable's rehash complexity may be quadratic in worst case 但
我正在将用户从遗留用户存储迁移到我的 ASP.NET 5.0 Web 应用程序中的 ASP.NET Identity 2.0。我有一种验证遗留哈希的方法,但我想在登录时将它们升级到 ASP.NET I
我正在尝试在安装新 gem 后重新哈希 rbenv它在我的 ubuntu 服务器上给了我这些错误 rbenv: cannot rehash: /home/deployer/.rbenv/shims/
我是一名优秀的程序员,十分优秀!