我一直在读 cplusplus.com 网站并试图确保我的 无序集 数字不会以任何方式修改。该网站说容器的元素没有排序,普通的情况就是这样 .

该网站还这样说:

在内部,元素 unordered_set 不以任何特定的顺序进行排序,而是根据其哈希值而组织为存储桶,以允许通过其值直接快速访问单个元素。

我不知道这到底意味着什么(顺便说一句,你能解释一下吗?)。考虑以下示例:

typedef const std::unordered_set<short> set_t;
set_t some_set = {1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36};

我可以确保上面的设置“some_set”永远不会改变并且数字将始终保持相同的顺序(因为这是这里的目标)?我也不打算在集合中插入或删除数字。

有帮助吗?

解决方案

typedef const std::unordered_set<short> set_t;
set_t some_set = {1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36};

中的数字顺序变化 some_set 取决于您执行的操作 some_set. 。的内容 some_set 创建后立即未定义,但可能不会 {1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36}. 。您可以通过一个简单的演示来了解这一点:

#include <iostream>
#include <unordered_set>

int main() {
    typedef const std::unordered_set<short> set_t;
    set_t some_set = {1,3,5,7,9,12,14,16,18,19,21,23,25,27,30,32,34,36};

    for (short s : some_set)
        std::cout << s << std::endl;

    // The order won't change if we don't modify the contents
    std::cout << "AGAIN!" << std::endl;
    for (short s : some_set)
        std::cout << s << std::endl;

    // If we put a bunch of stuff in
    for (short s = 31; s < 100; s += 4)
        some_set.insert(s);

    // The elements from *before* the modification are not necessarily in the
    // same order as before.
    std::cout << "MODIFIED" << std::endl;
    for (short s : some_set)
        std::cout << s << std::endl;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top