【问题标题】:Is there any order exists in unordered_set in c++?c++ 中的 unordered_set 中是否存在任何顺序?
【发布时间】:2021-01-15 23:50:01
【问题描述】:
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 不使用哈希吗? 而且哈希没有顺序。

【问题讨论】:

  • IDE 对此一无所知。这是由编译器提供的标准库实现的结果。例如,您会看到 clang 和 msvc 的不同结果。

标签: c++ hash stl unordered-set


【解决方案1】:

确实是个糟糕的名字。我相信 C++ 标准委员会想将其称为 std::hash_set,但在 C++11 标准化之前,有太多所谓的 std::hash_sets 在流通。这同样适用于std::unordered_map:请参阅面向 C++03 及更早版本的 Boost 发行版的hash_map

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

(幸运的是,在 C++17 中 boost::optional 成长为 std::optional:希望吸取教训,避免 std::discretionary 之类的事情。)

【讨论】:

    【解决方案2】:

    这对于每个 IDE 和每次都是一样的。

    不承诺关于元素顺序的任何事情与承诺每次都不同的顺序不同。

    而哈希没有顺序。

    有元素,它们可以被迭代。这是一个命令。它们不是按自然顺序排列的。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2016-12-11
        相关资源
        最近更新 更多