我有一个std::vector<MyString>
哪些数据不是唯一的。实际上,大多数字符串都是重复的。我必须找到独特的和重复的数字。
我使用map:
std::map<MyString,unsigned short> stringsMap;
.......
if ( stringsMap.find( currentString ) == stringsMap.end() )
{
stringsMap[ currentString ] = 0;
}
stringsMap[ currentString ]++;
........
您是否有想法如何在更少的线路上完成?
可以在一行上完成:stringsMap[ currentString ]++;
但是默认情况下,short有不确定的值。
答案 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
必须符合CopyConstructible
和DefaultConstructible
的要求 如果执行插入,则映射值是值初始化的(默认构造为类类型,零初始化,否则),并返回对它的引用。
因此,只写
std::map<MyString,unsigned short> stringsMap;
.......
stringsMap[ currentString ]++;
非常好。整个if
块是多余的,不需要。
1) 这不是真的,是@Remy Lebau的重点