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

Is there any order exists in unordered_set in c++?

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 不是使用哈希吗? 而 hash 没有顺序。

确实是一个糟糕的名字。我相信 C++ 标准委员会想称它为 std::hash_set,但在 C++11 中标准化之前流通的 so-called std::hash_set 太多了。这同样适用于 std::unordered_map:请参阅针对 C++03 及更早版本的 Boost 发行版的 hash_map

就哈希桶的顺序而言,它们确实是有序的,但需要说明的重点是您不应该关心顺序。

(幸运的是,在 C++17 中 boost::optional 变成了 std::optional:希望吸取教训,避免像 std::discretionary 这样的事情。)

This is same for every IDE and for every time.

不承诺元素的顺序与每次都承诺不同的顺序不同。

And hash don't have an order.

有元素,可以迭代。那是 一个 顺序。它们不符合自然顺序。

哈希是确定性的,所以unordered_set是确定性的,否则你将无法检索集合中的元素。

您看到的顺序只是 unordered_set 中存储桶的内容,如果 unordered_set 决定调整大小,顺序可以更改。