前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何优雅地实现判断一个值是否在一个集合中?

如何优雅地实现判断一个值是否在一个集合中?

作者头像
编程珠玑
发布2021-01-05 11:35:52
1.7K0
发布2021-01-05 11:35:52
举报
文章被收录于专栏:编程珠玑编程珠玑

如何判断某变量是否在某个集合中?注意,这里的集合可能并不是指确定的常量,也可能是变量。

版本0

代码语言:javascript
复制
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include <iostream>
int main(){
    int a = 5;
    if(a == 1 || a == 2 || a == 3 || a == 4 || a == 5){
        std::cout<<"find it"<<std::endl;
    }
    return 0;
}

常规做法,小集合的时候比较方便,观感不佳。

版本1

代码语言:javascript
复制
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include <iostream>
#include <set>
int main(){
    int a = 5;
    std::set<int> con_set = {1, 2, 3, 4, 5}; 
    if(con_set.find(a) != con_set.end()){
        std::cout<<"find it"<<std::endl;
    }
    return 0;
}

不够通用;不是常数的情况下,还要临时创建set,性能不够,性价比不高。当然通用一点你还可以这样写:

代码语言:javascript
复制
std::set<decltype(a)> con_set = {1, 2, 3, 4, 5};

版本2

代码语言:javascript
复制
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include <iostream>
// 单参
template <typename T>
inline bool IsContains(const T& target) {
  return false;
}

template <typename T, typename... Args>
inline bool IsContains(const T& target, const T& cmp_target, const Args&... args) {
  if (target == cmp_target)
    return true;
  else
    return IsContains(target, args...);
}
int main(){
    int a = 6;
    if(IsContains(a,1,2,3,4,5)){
        std::cout<<"find it"<<std::endl;
    }
    return 0;
}

模板,通用做法。

版本3

需要C++17支持:,涉及的特性叫做fold expression,可参考:

https://en.cppreference.com/w/cpp/language/fold

代码语言:javascript
复制
// 来源:公众号【编程珠玑】
// 作者:守望先生
#include <iostream>
template <typename T, typename... Args>
inline bool IsContains(const T& target, const Args&... args) {
    return (... || (target == args));
}
int main(){
    int a = 5;
    if(IsContains(a,1,2,3,4,5)){
        std::cout<<"find it"<<std::endl;
    }
    return 0;
}

总结

我反正是学废了。你还有什么好的方法?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 版本0
  • 版本1
  • 版本2
  • 版本3
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档