默认构造函数unordered_map,bool类型将设置为false?

时间:2014-08-27 01:56:12

标签: c++ c++11 unordered-map

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

谢谢,非常感谢您的回答。

2 个答案:

答案 0 :(得分:10)

如果密钥不存在,则operator []的{​​p} std::mapstd::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::mapstd::unordered_map,如果密钥不存在,则会向std::map / {{1}添加新的值初始化元素}。

std::unordered_map类型的值已初始化为bool。没有未定义的行为。