内部是否修改了unordered_set?

时间:2014-07-31 00:32:57

标签: c++ unordered-set

我一直在阅读cplusplus.com 网站,并尝试确保我的 unordered_set 数字不会以任何方式被修改。该网站表示容器的元素未按明确 set 的情况进行排序。

该网站也说过:

  

在内部,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};

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

1 个答案:

答案 0 :(得分:1)

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;
}