繁体   English   中英

如何在没有std :: string中介的情况下创建一个支持通过C字符串查找的set <string>?

[英]How can I make a set<string> that supports lookup via C string, without a std::string intermediary?

假设我有一个std::set<std::string> ,我想知道它是否包含字符串“name”:

#include <string>
#include <set>
using namespace std;
bool has_name(const set<string> &s) {
    return s.find("name") != s.end();
}

上面的函数构造并销毁一个值为“name”的临时std :: string。 这种低效率似乎是不必要的,因为std :: string具有直接与const char *进行比较的功能。 我想消除这个暂时的。

我尝试使用带有重载的自定义比较器:

struct str_comp_t {
    bool operator()(const string &s1, const char *s2) const {
        return s1.compare(s2) < 0;
    }

    bool operator()(const string &s1, const string &s2) const {
        return s1.compare(s2) < 0;
    }
};

typedef std::set<string, str_comp_t> string_set_t;
bool has_name_2(const string_set_t &s) {
    return s.find("name") != s.end();
}

但是只调用带有std :: string的变体; const char *被忽略。

如何使这个集合直接与常量字符串进行比较,而不是构造一个中间字符串?

在C ++ 14中,使用透明比较器

std::set<std::string, std::less<>> s;
//                    ^^^^^^^^^^^

s.find("Hello");  // no temporary

透明比较谓词std::less<>有一个模板化的operator() ,而专门用透明谓词的C ++ 14容器暴露了find模板重载。

透明比较器是严格选择的,因此std::set<std::string>不会自动获得新的重载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM