其他分享
首页 > 其他分享> > c – 如何使map :: find操作不区分大小写?

c – 如何使map :: find操作不区分大小写?

作者:互联网

map :: find方法是否支持不区分大小写的搜索?我有一张地图如下:

map<string, vector<string> > directory;

并希望以下搜索忽略大小写:

directory.find(search_string);

解决方法:

它不是默认的.您必须提供自定义比较器作为第三个参数.以下片段将帮助您……

  /************************************************************************/
  /* Comparator for case-insensitive comparison in STL assos. containers  */
  /************************************************************************/
  struct ci_less : std::binary_function<std::string, std::string, bool>
  {
    // case-independent (ci) compare_less binary function
    struct nocase_compare : public std::binary_function<unsigned char,unsigned char,bool> 
    {
      bool operator() (const unsigned char& c1, const unsigned char& c2) const {
          return tolower (c1) < tolower (c2); 
      }
    };
    bool operator() (const std::string & s1, const std::string & s2) const {
      return std::lexicographical_compare 
        (s1.begin (), s1.end (),   // source range
        s2.begin (), s2.end (),   // dest range
        nocase_compare ());  // comparison
    }
  };

像std :: map<一样使用它std :: string,std :: vector< std :: string>,ci_less> MYMAP;

注意:std :: lexicographical_compare有一些细节.如果考虑区域设置,字符串比较并不总是很简单.如果感兴趣,请参阅c.l.c上的this线程.

更新:使用C 11 std :: binary_function已弃用,因为类型是自动推断的,所以不需要.

  struct ci_less
  {
    // case-independent (ci) compare_less binary function
    struct nocase_compare
    {
      bool operator() (const unsigned char& c1, const unsigned char& c2) const {
          return tolower (c1) < tolower (c2); 
      }
    };
    bool operator() (const std::string & s1, const std::string & s2) const {
      return std::lexicographical_compare 
        (s1.begin (), s1.end (),   // source range
        s2.begin (), s2.end (),   // dest range
        nocase_compare ());  // comparison
    }
  };

标签:c,string,dictionary,case-insensitive,stl
来源: https://codeday.me/bug/20190923/1814894.html