我不理解为什么std :: unordered_set的erase方法在最坏情况下(其中N是元素数量)具有O(N)复杂度。标准(n4296)指出,所有三个版本的erase方法在最坏情况下具有O(a.size())复杂度(a是容器),并且仅使指向已删除元素的迭代器无效,而不是所有迭代器(即重新哈希不会发生)。这甚至适用于使用一个迭代器参数且平均复杂度为常数的版本。我认为这是因为erase版本返回到下一个元素的迭代器,这需要查找已删除元素后第一个非空bucket,并且它给出了O(a.bucket_count())复杂度,而不是O(a.size())。元素数量与桶的数量没有直接比例关系。例如:
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
std::unordered_set<int> aSet;
aSet.insert ({125, 126});
aSet.rehash (1000);
cout << aSet.size() << endl;
cout << aSet.bucket_count() << endl;
}
输出结果为
Size: 2
Bucket count: 1031
一个容器的大小只有2,而bucket_count是1031。当调用erase方法时,它会寻找下一个非空桶,该桶可以放置在末尾附近,即复杂度为O(a.bucket_count()),而不是O(a.size())。标准为什么给出了O(a.size())的复杂度?
a.bucket_count()
与a.size()
相同或更大,否则复杂度小于O(a.bucket_count())
。 - kfxO(bucket_count())
部分是不正确的。请参见LWG 579。 - T.C.