默认的unordered_map构造函数,bool类型会被设置为false吗?

Bro*_*ley 0 c++ unordered-map c++11

我对unordered_map的默认构造函数有一些疑问.

这是代码:

unordered_map<int, bool> m;

cout <<boolalpha << m[0] << endl;
Run Code Online (Sandbox Code Playgroud)

输出是真还是假?

我知道元素是使用其默认构造函数构造的,但映射的值是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;
     }  
}
Run Code Online (Sandbox Code Playgroud)

谢谢,我真的很感激你的回答.

T.C*_*.C. 10

operator []std::mapstd::unordered_map插入一个值初始化元件如果键不存在(§23.4.4.3[map.access]/P1,§23.5.4.3[unord.map.elem]/P2;第8.5节[dcl.init]/P17).对于非类非数组类型,值初始化意味着零初始化(§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);
Run Code Online (Sandbox Code Playgroud)

在之后std::copy的来电,第一s.size()要素a是不可重复的元素.演示.

或者更清洁的方式(帽子提示@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;
Run Code Online (Sandbox Code Playgroud)

第一个dedup_size元素a是非重复元素.演示.