在c ++中的unordered_set中是否存在任何顺序?

问题描述

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决定调整大小,则顺序可以更改。