【问题标题】:default contructor of unordered_map, the bool type will be set as false?unordered_map的默认构造函数,bool类型会设置为false吗?
【发布时间】:2014-08-27 01:56:12
【问题描述】:

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

代码如下:

unordered_map<int, bool> m;

cout <<boolalpha << m[0] << endl;

输出是真还是假?

我知道元素是使用其默认构造函数构造的,但映射的值是真还是假?这是未定义的行为吗?

在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;
     }  
}

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

【问题讨论】:

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


    【解决方案1】:
    如果键不存在,std::mapstd::unordered_map

    operator [] 插入一个 值初始化 元素(§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);
    

    std::copy 调用之后,a 的第一个s.size() 元素是非重复元素。 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;
    

    a 的第一个 dedup_size 元素是非重复元素。 Demo.

    【讨论】:

    • +1 但不是更干净的方法是先调用sort,然后再调用unique
    • @Praetorian True :) 我考虑了两者,实际上......虽然你必须用 unique 自己计算大小,因为你不能将 erase 与数组一起使用......
    • @T.C.太感谢了。爱你和stackoverflow。^^
    【解决方案2】:

    对于std::mapstd::unordered_map,如果键不存在,则将一个新的value-initialized 元素添加到std::map/std::unordered_map

    bool 的类型被初始化为false。没有未定义的行为。

    【讨论】:

    • 所以它不是默认初始化的?
    • @pqnet 我记得。
    • 已确认。删除我的答案不相关。
    • @Yu Hao 非常感谢您的回答。爱你和stackoverflow。^^
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多