我对unordered_map的默认构造函数有一些疑问。
以下是代码:
unordered_map<int, bool> m;
cout <<boolalpha << m[0] << endl;
输出是真还是假?
我知道元素是使用默认构造函数构造的,但映射的值是true还是false?这是未定义的行为吗?
在vs2013中,输出为false
。
实际上,我想删除数组中的重复元素。我想解决这个问题:
int a[] = {1, 2, 3, 1, 2, 3, 4};
unordered_map<int, bool> m;
int j = 0;
for (int i = 0; i < 7; ++i)
{
if (!m[a[i]])
{
a[j++] = a[i];
m[a[i]] = true;
}
}
谢谢,非常感谢您的回答。
答案 0 :(得分:10)
operator []
的{p} std::map
和std::unordered_map
会插入值初始化的元素(第23.4.4.3节[map.access] / p1,§23.5.4.3[unord.map.elem] / p2;§8.5[dcl.init] / p17)。对于非类非数组类型, value-initialization 表示零初始化(§8.5[dcl.init] / p8)。因此,您示例中的bool
保证为false
。
(IMO清洁工)完成您要做的事情的方法是使用std::set
(或std::unordered_set
):
int a[] = {1, 2, 3, 1, 2, 3, 4};
std::set<int> s(std::begin(a), std::end(a));
std::copy(s.begin(), s.end(), a);
std::copy
调用后,s.size()
的第一个a
元素是非重复元素。 Demo
或者更清洁的方式(帽子提示@Praetorian):
int a[] = {1, 2, 3, 1, 2, 3, 4};
std::sort(std::begin(a), std::end(a));
int * last = std::unique(std::begin(a), std::end(a));
int dedup_size = last - a;
dedup_size
的第一个a
元素是非重复元素。 Demo
答案 1 :(得分:1)
对于std::map
和std::unordered_map
,如果密钥不存在,则会向std::map
/ {{1}添加新的值初始化元素}。
std::unordered_map
类型的值已初始化为bool
。没有未定义的行为。