加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c地图的.containsKey()方法

发布时间:2020-12-16 10:11:43 所属栏目:百科 来源:网络整理
导读:我想保存一些重复的工作并编写一个模仿 Java的函数 ?.containsKey()方法. 基本上我想要这样的东西: using namespace std; mapstring,XYclass mymap; if (!contains(mymap,"key as string") ) cout "key not found" endl; 在C中,如果地图包含以下方式的密钥,
我想保存一些重复的工作并编写一个模仿 Java的函数
?.containsKey()方法.

基本上我想要这样的东西:

using namespace std;
 map<string,XYclass> mymap;
 if (!contains(mymap,"key as string") ) cout << "key not found" << endl;

在C中,如果地图包含以下方式的密钥,则可以检查:

m.find(str) != m.end();

我想写一个泛型方法,如果一个键包含在一个映射中,它返回true.

到目前为止我有以下内容:

template<typename A,typename B> inline bool contains(const std::map< A,B > m,const A& str)
{
    return m.find(str) != m.end();
}

当我在地图上运行时,它将无法进行模板参数推导< string,int>跟随调用包含(mymap,“key as string”),因为“key as string”实际上是一个char数组.

当我进行显式实例化时,函数工作正常(即通过使用以下调用包含< string,int>(mymap,“key as string”))

怎么做得好?

解决方法

可以使用以下标识技巧从模板参数推导中排除参数:

template <typename T>
struct identity { typedef T type; };

template <typename A,typename B>
inline bool contains(const std::map<A,B>& m,const typename identity<A>::type& str)
{
    return m.find(str) != m.end();
}

DEMO

您现在不需要显式指定类型模板参数.

确切地说,std :: map总共有四个类型模板参数:

template <typename A,typename B,typename Cmp,typename Alloc>
inline bool contains(const std::map<A,B,Cmp,Alloc>& m,const typename identity<A>::type& str);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读