unordered_set 是否在内部被修改?
-
21-12-2019 - |
题
我一直在读 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;
}
不隶属于 StackOverflow