我想在 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<>?
我用模板编写了类。类具有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
);或者通过引用参数返回结果,并用布尔返回值指示成功;或者抛出异常。
您有三种选择:
throw
异常- 修改签名,以便返回带外数据(这是@JaredPar的建议)
- 返回带内数据
如果必须选择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,或不管你怎么称呼它);虽然这是一个很好的解决方案,但似乎这里太夸张了。或者最后,如果对象不存在。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中