Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何覆盖无序映射的[]运算符_C++_Stl - Fatal编程技术网

C++ 如何覆盖无序映射的[]运算符

C++ 如何覆盖无序映射的[]运算符,c++,stl,C++,Stl,要检查无序的_映射中是否存在密钥。目前我使用count()成员函数。如果大于0,则表示该键存在 不知道是否可以执行以下操作: typedef std::unordered_map< long, long > m; m[100] = 20; m[1000] = 200; ... //get user input x as an integer if (m[x] == 0) { //do something } typedef std::无序_映射m; m[100]=20; m

要检查无序的_映射中是否存在密钥。目前我使用
count()
成员函数。如果大于0,则表示该键存在

不知道是否可以执行以下操作:

typedef std::unordered_map< long, long > m;
m[100] = 20;
m[1000] = 200;
...
//get user input x as an integer
if (m[x] == 0) {
    //do something
}
typedef std::无序_映射m;
m[100]=20;
m[1000]=200;
...
//获取用户输入x作为整数
如果(m[x]==0){
//做点什么
}
上述代码的问题在于,对于不存在的键
x
如果(m[x]==0)
将向映射添加一个条目。我需要的是,
[]
运算符在键不存在的情况下返回默认值(当类型为long时返回“0”,如果类型为string,则返回int,空字符串对象)(只需不添加条目)。在我的情况下,无序映射项的值不是零。不知道如何覆盖此运算符。有什么想法吗?谢谢

改用
.find()
<代码>如果(map.find(key)!=map.end())则它存在于地图中。否则
if(map.find(key)=map.end())
它不存在。

使用
.find()
<代码>如果(map.find(key)!=map.end())则它存在于地图中。否则
if(map.find(key)=map.end())
它不存在

我需要的是,如果键不存在,[]运算符返回默认值(如果类型为long,则返回“0”;如果类型为string,则返回int,空string对象)(只需不添加条目)

您可以自己编写这样一个函数-您不需要重写任何内容:

template <typename K, typename T, typename H, typename KE, typename A>
T value_or_default(const std::unordered_map<K,T,H,KE,A>& map,
                   const K& key,
                   T def = T{})
{
    auto it = map.find(key);
    return it != map.end() ? it->second : def;
}
模板
T值或默认值(常量标准::无序映射和映射,
康斯特克基,
T def=T{})
{
auto it=map.find(键);
返回它!=map.end()?它->第二个:def;
}
我需要的是,如果键不存在,[]运算符返回默认值(如果类型为long,则返回“0”;如果类型为string,则返回int,空string对象)(只需不添加条目)

您可以自己编写这样一个函数-您不需要重写任何内容:

template <typename K, typename T, typename H, typename KE, typename A>
T value_or_default(const std::unordered_map<K,T,H,KE,A>& map,
                   const K& key,
                   T def = T{})
{
    auto it = map.find(key);
    return it != map.end() ? it->second : def;
}
模板
T值或默认值(常量标准::无序映射和映射,
康斯特克基,
T def=T{})
{
auto it=map.find(键);
返回它!=map.end()?它->第二个:def;
}


但是,他可以从无序映射继承并覆盖它。您可以为指定不同的spacename,这样它的类名仍然是“无序映射”,但spacename不同。
count
成员函数有什么问题?您永远都不想从标准容器继承。这是一个非常糟糕的计划。@Puppy:别再散布恐慌了。事实上,从标准容器继承通常没有什么问题,但是他可以从无序映射继承并重写它。您可以为指定不同的spacename,这样它的类名仍然是“无序映射”,但spacename不同。
count
成员函数有什么问题?您永远都不想从标准容器继承。这是一个非常糟糕的计划。@Puppy:别再散布恐慌了。事实上,从标准容器继承通常没有什么问题。不知道是否有可能重载操作符
[]
。我试图执行
long操作符[](std::unordered_map&m,long x)
,但错误显示操作符[]必须是成员函数。我应该从类继承吗?谢谢。@codingFun我只想写自由函数。即使您编写了自己的类,我仍然不会重载
操作符[]
,我会编写一个单独的成员函数(例如,Python不同于
dict.uuu getitem_uuu
),忘了提一下我得到了一个要求,即推荐的语法是
[]
,这就是所有挑战的原因:-“我想我可以告诉你。坏的要求。希望我能拒绝这个要求。它来自于知道脚本语言的人,这是微不足道的,但它是C++。怀疑是否有可能超载操作符<代码> [COD]。我尝试做<代码>长运算符[]:(STD:un无序DigMaP<长,长> m,长X)。,但错误显示运算符[]必须是成员函数。我应该从类继承吗?谢谢。@codingFun我只编写自由函数。即使您编写了自己的类,我也不会重载运算符[]来执行此操作-我会编写一个单独的成员函数(例如,Python不同于dict.uuu getitem_uuuuu)忘了提到我得到的要求是推荐语法为
[]
,这就是所有挑战的原因:-(我想告诉你什么。坏的要求。希望我能拒绝这个要求。它来自于知道脚本语言的人,这是微不足道的,但它是C++。