[英]How are new std::map entries initialized just by key insertion?
我有一个std::vector<MyString>
,该数据不是唯一的。 实际上,大多数字符串都是重复的。 而且我必须找到唯一的和重复的编号。
我使用地图:
std::map<MyString,unsigned short> stringsMap;
.......
if ( stringsMap.find( currentString ) == stringsMap.end() )
{
stringsMap[ currentString ] = 0;
}
stringsMap[ currentString ]++;
........
您有想法如何在更少的行上完成吗?
可以在一行上完成: stringsMap[ currentString ]++;
但是short默认情况下具有不确定的值。
可以在一行上完成:stringsMap [currentString] ++; 但是short默认情况下具有不确定的值。
这是不正确的,价值的定义如文档所述 :
如果执行插入操作,则将对映射的值进行值初始化(对于类类型,默认为默认构造, 否则为零初始化 ),并返回对其的引用。
重点是我的。
因此,写一个衬纸是完全可以的:
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];
}
但是short默认情况下具有不确定的值。
否。对于不存在的键,映射将使用T()
初始化新创建的条目的值,对于unsigned short
,该条目的有效值为0
。
请参阅std::map::operator[]
文档 (强调我的1 ):
1)如果键不存在
value_type(key, T())
插入value_type(key, T())
。 此函数等效于return insert(std::make_pair(key, T())).first->second;
-key_type
必须满足的要求,CopyConstructible
。
mapped_type
必须满足CopyConstructible
和DefaultConstructible
的要求。
如果执行插入操作,则将对映射的值进行值初始化(对于类类型,默认为默认构造, 否则为零初始化 ),并返回对其的引用。
因此,只写
std::map<MyString,unsigned short> stringsMap;
.......
stringsMap[ currentString ]++;
很好。 整个if
块是多余的,不需要。
1) 这不是真的,这是@Remy Lebau的重点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.