我一直在阅读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;永远不会改变,数字将始终保持相同的顺序(因为这是这里的目标)? 我也不打算在集合中插入或删除数字。
答案 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;
}