如何通过键插入初始化新的std :: map条目?

时间:2017-12-05 18:10:55

标签: c++ stdmap

我有一个std::vector<MyString>哪些数据不是唯一的。实际上,大多数字符串都是重复的。我必须找到独特的和重复的数字。

我使用map:

std::map<MyString,unsigned short> stringsMap;
.......
if ( stringsMap.find( currentString ) == stringsMap.end() )
{
    stringsMap[ currentString ] = 0;
}

stringsMap[ currentString ]++;
........

您是否有想法如何在更少的线路上完成?

可以在一行上完成:stringsMap[ currentString ]++;但是默认情况下,short有不确定的值。

2 个答案:

答案 0 :(得分:3)

  

可以在一行上完成:stringsMap [currentString] ++;但是,默认情况下,短期值具有不确定值。

事实并非如此,documentation中已明确定义了价值:

  

如果执行插入,则映射的值是值初始化的(默认为类类型构造,零初始化,否则),并返回对它的引用。

重点是我的。

所以写一个班轮是完全没问题的:

stringsMap[ currentString ]++;

这是常见做法,甚至在文档中作为示例提供:

// count the number of occurrences of each word
// (the first call to operator[] initialized the counter with zero)
std::map<std::string, size_t>  word_map;
for (const auto &w : { "this", "sentence", "is", "not", "a", "sentence",
                       "this", "sentence", "is", "a", "hoax"}) {
    ++word_map[w];
}

答案 1 :(得分:1)

  

但是,默认情况下,短期值具有不确定值。

没有。对于非现有密钥,映射将使用T()初始化新创建的条目的值,这有效地评估0 unsigned short

参见std::map::operator[] documentation(强调我的 1 ):

  
    

1)如果密钥不存在,则插入value_type(key, T())。此功能相当于return insert(std::make_pair(key, T())).first->second;
     - key_type必须符合CopyConstructible的要求      - mapped_type必须符合CopyConstructibleDefaultConstructible的要求     如果执行插入,则映射值是值初始化的(默认构造为类类型,零初始化,否则),并返回对它的引用。

  

因此,只写

std::map<MyString,unsigned short> stringsMap;
.......
stringsMap[ currentString ]++;

非常好。整个if块是多余的,不需要。

1) 这不是真的,是@Remy Lebau的重点