gpt4 book ai didi

c++ - 如何制作一个 set 支持通过 C 字符串进行查找,而无需 std::string 中介?

转载 作者:太空狗 更新时间:2023-10-29 20:24:43 27 4
gpt4 key购买 nike

假设我有一个 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 中,使用 transparent comparators :

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

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

透明比较谓词std::less<>有一个模板化的 operator()和专门使用透明谓词的 C++14 容器公开了 find 的模板重载.

透明比较器是严格选择加入的,所以 std::set<std::string>不会自动获取新的重载。

关于c++ - 如何制作一个 set<string> 支持通过 C 字符串进行查找,而无需 std::string 中介?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26577770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com