制作std :: unordered_set CASE-INSENSITIVE容器的最短,最跨平台的方法是什么?
my_set.insert("Apples"); my_set.insert("apples"); //Insert doesn't occur because of duplicate item
我知道STL提供Hash和Pred.哈什应该怎么做? Pred应该是什么?如果它们不是内置的,那么请提供它们的代码以及它们的使用示例(即如何声明std :: unordered_set?).
由于批评,我将详细说明我要做的事情.我需要一个高性能的透明HTTP代理服务器,它所做的一件事就是快速查找HTTP头字段. HTTP标头字段被定义为不区分大小写,因此我需要一个不区分大小写的容器.
解决方法
unordered_set的定义是
template <class Value,class Hash = hash<Value>,class Pred = std::equal_to<Value>,class Alloc = std::allocator<Value> > class unordered_set;
如果你提供不区分大小写的Hash和Pred函子,那么集合也会变得如此.
这是一个简单的例子,字符串hash function is simplistic,但您可以根据需要进行更改
struct MyHash { size_t operator()(const std::string& Keyval) const { //You might need a better hash function than this size_t h = 0; std::for_each( Keyval.begin(),Keyval.end(),[&](char c ) { h += tolower(c); }); return h; } }; struct MyEqual { bool operator()(const std::string& Left,const std::string& Right) const { return Left.size() == Right.size() && std::equal ( Left.begin(),Left.end(),Right.begin(),[]( char a,char b ) { return tolower(a) == tolower(b); } ); } }; int main() { std::unordered_set< std::string,MyHash,MyEqual > m; m.insert( "Apple" ); m.insert( "apple" ); return 0; }