uni*_*n83 8 c++ stl case-insensitive
制作std :: unordered_set CASE-INSENSITIVE容器的最短,最跨平台的方法是什么?
my_set.insert("Apples");
my_set.insert("apples"); //Insert doesn't occur because of duplicate item
Run Code Online (Sandbox Code Playgroud)
我知道STL提供Hash和Pred.我应该散列是什么?Pred应该是什么?如果它们不是内置的,那么请提供它们的代码以及它们的使用示例(即我如何声明std::unordered_set?).
由于批评,我将详细说明我要做的事情.我需要一个高性能的透明HTTP代理服务器,它所做的一件事就是快速查找HTTP头字段.HTTP头字段被定义为不区分大小写,因此我需要一个不区分大小写的容器.
par*_*mar 12
定义unordered_set是
template <class Value,
class Hash = hash<Value>,
class Pred = std::equal_to<Value>,
class Alloc = std::allocator<Value> >
class unordered_set;
Run Code Online (Sandbox Code Playgroud)
如果你提供不区分大小写的Hash和Pred仿函数,那么集合也会变得如此.
这是一个简单的例子,字符串哈希函数是simplisti Ç,但你可以将其更改为您的需求
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4594 次 |
| 最近记录: |