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

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提供HashPred.我应该散列是什么?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)

如果你提供不区分大小写的HashPred仿函数,那么集合也会变得如此.

这是一个简单的例子,字符串哈希函数是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)

  • @LokiAstari:http://en.cppreference.com/w/cpp/container/unordered_set/insert"返回一个由bool组成的对,表示插入是否发生以及插入元素的迭代器" (3认同)
  • 虽然你应该在'MyHash`和`MyEqual`中坚持使用`tolower`或`toupper`,因为它们并不总是可传递的.更好的是使用Unicode规范中描述的正确的大小写折叠. (2认同)
  • 问题是这些值不区分大小写。如果迭代该集合,它会返回“Apple”还是“apple”? (2认同)
  • @LokiAstari无论先放入什么?第二个`insert`会失败. (2认同)
  • @dalle:请不要引用我的网站(它很糟糕,有很多不准确和开发人员的意见(这些并不总是正确的)).你想要的是n3242`23.2.4关联容器[associative.reqmts]`你会在哪里找到`表103 - 无序的关联容器要求(除了容器)`.如果您没有该标准的副本,请获取一个:http://stackoverflow.com/a/4653479/14065 (2认同)