我想在 c++ 中为 map<> 的给定键返回一个值。如果 KEY 在 map<> 中不存在,要返回什么?

I want to return a VALUE for given KEY for map<> in c++. What to return in case KEY is not present in map<>?

本文关键字:gt lt map 返回 KEY 如果 什么 一个 不存在 c++ 中为      更新时间:2023-10-16

我用模板编写了类。类具有map as成员和一些getxxx()/setxxx()成员函数。

template<typename T1,typename T2>
class C1{
    map<T1,T2> M;
public:
    map<T1,T2> getM();
    T2 getMvalue(T1 Key);
    void setM(T1 key,T2 Value);
};

在这里,我想实现getMvalue(),它接收key作为参数,并在mapM中有"key"的情况下返回相应的"value"。

它看起来有点像。。。

template<typename TKey,typename TValue>
T2 C1<T1,T2>::getMvalue(T1 Key){
    if(M.count(Key)>0)
        return M[Key];
    else
        return(???);
};

在这里我需要用一些东西来代替???。请记住,函数的返回类型是T2,它可以是任何取决于用户决定的内容。如何将"???"替换为什么?

我鼓励您使用TryGet模式

template<typename TKey,typename TValue>
bool C1<T1,T2>::tryGetMvalue(T1 key, T2& value){
    if(M.count(key)>0) {
        value = objProperties[key];
        return true;
    }
    return false;
};

通过使用operator[],您已经将自己限制为只存储默认的可构造值;所以您可以返回TKey()-除非用户需要能够判断它是否真的被找到。

如果你不想要这个限制,那么你就必须把它改成类似于:

auto found = map.find(key);
if (found != map.end()) {
    return found->second;
} else {
    return ???;
}

现在,指示失败的最简单方法是将返回类型更改为指针(如果要按值返回,则可能为boost::optional),并返回null(或boost::none);或者通过引用参数返回结果,并用布尔返回值指示成功;或者抛出异常。

您有三种选择:

  1. throw异常
  2. 修改签名,以便返回带外数据(这是@JaredPar的建议)
  3. 返回带内数据

如果必须选择3,我会返回默认值(这就是std::map::operator[]的作用):

template<typename TKey,typename TValue>
  T2 C1<T1,T2>::getMvalue(T1 Key){
    if(M.count(Key)>0)
      return M[Key];
    else
      return T2();
  }; 

小心,设计选择#3会导致错误。调用者无法区分"标称值"answers"不存在"。


附言:如果你确实返回了默认值,那么你的代码可能会简化为:

template<typename TKey,typename TValue>
T2 C1<T1,T2>::getMvalue(T1 Key){
  return M[key];
}

几种可能性。最简单的方法是让getter返回指针,如果键不在映射中,则使用空指针。或者,您可以让它返回一个Fallible(或Maybe,或不管你怎么称呼它);虽然这是一个很好的解决方案,但似乎这里太夸张了。或者最后,如果对象不存在。