微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

原文地址:https://www.jb51.cc/c/118773.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐