如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
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::字符串。这种低效似乎没有必要,因为std::string具有直接与constchar*进行比较的功能。我想消除这个暂时的。
我尝试使用带有过载的自定义比较器:
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>
不会自动获得新的过载。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- cppcheck在const std::string[]上引发警告
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 将std::string传递给WriteConsole API
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 为std::string的某个索引赋值
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- std中有类似find_last_of的函数,而string中没有
- 为什么C STD :: String可以支持日本的角色,法语
- 读取STD :: String Line(带有空格和特殊钥匙支持)
- 为什么 gcc-4.9.2 不能支持 std::string.insert(迭代器,范围)返回迭代器
- [swig-JavaScript]是否支持std::vector<std::string>*作为输出?
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 如何使助推unordered_map支持蝇量级<string>
- libstdc++ std::string支持c++ 11破碎
- c++ 11和c++ 03在支持std::string的小字符串优化方面有所不同