gpt4 book ai didi

c++ - 不区分大小写的 STL 容器(例如 std::unordered_set)

转载 作者:可可西里 更新时间:2023-11-01 17:37:23 26 4
gpt4 key购买 nike

制作 std::unordered_set CASE-INSENSITIVE 容器的最短、最跨平台的方法是什么?

my_set.insert("Apples");  
my_set.insert("apples"); //Insert doesn't occur because of duplicate item

我知道STL提供了HashPredHash 应该是什么? Pred 应该是什么?如果它们不是内置的,那么请提供它们的代码以及它们的使用示例(即我如何声明 std::unordered_set?)。

由于批评,我将详细说明我正在尝试做的事情。我需要一个高性能的透明 HTTP 代理服务器,它所做的其中一件事就是快速查找 HTTP header 字段。 HTTP header 字段被定义为不区分大小写,因此我需要一个不区分大小写的容器。

最佳答案

unordered_set的定义是

  template <class Value,
class Hash = hash<Value>,
class Pred = std::equal_to<Value>,
class Alloc = std::allocator<Value> >
class unordered_set;

如果您提供不区分大小写的 HashPred 仿函数,那么集合也会变成这样。

这是一个简单的例子,字符串 hash function is simplisti c 但您可以根据需要更改它

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;
}

关于c++ - 不区分大小写的 STL 容器(例如 std::unordered_set),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8627698/

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