问题描述
int main(){
unordered_set<int> S;
S.insert(1);
S.insert(10);
S.insert(100);
S.insert(64);
for(auto &x: S){
cout<<x<<" ";
}
cout<<endl;
S.erase(S.find(1),S.end());
for(auto &x: S){
cout<<x<<" ";
}
}
输出:
64 1 100 10
64
对于每个IDE以及每次都相同。
unordered_set
是否使用哈希?
而且哈希没有顺序。
解决方法
的确是个坏名字。我相信C ++标准委员会希望将其命名为std::hash_set
,但是在C ++ 11进行标准化之前,有太多所谓的std::hash_set
在发行。 std::unordered_map
同样适用:请参见面向C ++ 03及更早版本的Boost发行版的hash_map
。
在哈希桶已排序的范围内,它们的确是有序的,但是需要说明的主要一点是,您不应该对该命令进行关心。
(幸运的是,在C ++ 17中boost::optional
成长为std::optional
:希望可以吸取教训,并避免使用类似std::discretionary
的东西。)
对于每个IDE每次都是相同的。
不保证元素顺序与每次都保证不同的顺序是不同的。
并且哈希没有顺序。
有些元素可以迭代。这是一个命令。它们不是自然顺序。
,哈希是确定性的,因此unordered_set是确定性的,否则您将无法检索集合中的元素。
您看到的顺序只是unordered_set中存储桶的内容,如果unordered_set决定调整大小,则顺序可以更改。