我有unordered map
:
static unordered_map<int, long> my_map;
auto& result = my_map[i];
如果没有密钥i
,则结果为0
。
是否可以返回其他值,例如NULL
或-MAXINT
?
答案 0 :(得分:4)
你可以做类似的事情(不在地图中插入值):
template <typename Key, typename Value>
Value& get_or(std::unordered_map<Key, Value>& m, const Key& key, Value& default_value)
{
auto it = m.find(key);
if (it == m.end()) {
return default_value;
}
return it->second;
}
或者,如果您想在地图中添加值(如果不存在):
template <typename Key, typename Value, typename T>
Value& get_or(std::unordered_map<Key, Value>& m, const Key& key, T&& default_value)
{
return m.emplace(key, std::forward<T>(default_value)).first->second;
}
并使用它
int default_value = 42;
auto& result = get_or(my_map, i, default_value);
答案 1 :(得分:2)
结果print int(round(25*(1+16.0/100)))
并不代表&#34;未找到值&#34;。找到值 :0
操作刚刚添加了它。结果为[]
,因为这是0
的默认值,而long
操作默认构建 []
。并且您无法更改long
的默认构造方式。
如果您想查看该元素是否已存在,您应该使用my_map.count(i)
,它会返回long
或1
,这意味着&#34;此密钥存在&#34;和&#34;此密钥不存在&#34;分别。如果该密钥不存在,您可以使用my_map.insert
添加一个您喜欢的值。
答案 2 :(得分:2)
当您使用my_map[i]
时,如果该值不存在,则会创建该值。所以你可以创建与ts默认构造函数不同的东西。或者long
的默认值。你有几个选择:
如果值不存在,请将值设置为您想要的值:
if (my_map.find(i) == my_map.end()) {
my_map[i] = MAX_INT; //Or whatever you want.
}
或者使用默认构造函数为long
创建自己的包装类:
struct DefLong {
long myLong;
long& operator() {
return myLong;
}
DefLong () : myLong(MAX_INT){}
}
....
static unordered_map<int, DefLong> my_map;
auto& result = my_map[i];
long otheresult = my_map[i];