【问题标题】:compare a character with various character classes in c++将一个字符与 C++ 中的各种字符类进行比较
【发布时间】:2011-02-04 06:17:34
【问题描述】:

问题是我想逐个比较字符串中的字符:对于每个字符,它是否属于字母表?是小写还是大写。我怎么能这样做?

这很好,如果我想将它与 (+-*^) 进行比较,就像没有标准函数一样。 请帮帮我

【问题讨论】:

    标签: c++ comparison character


    【解决方案1】:
    #include <cctype>
    #include <string>
    
    ...
    
    for (std::string::const_iterator i = s.begin(); i != s.end(); ++i)
        if (std::isalpha(*i))
            handle_alphabetic_character(*i);
        else
            handle_non_alphabetic_character(*i);
    

    编辑新要求:

    要在任意字符集中查找字符,您可以使用 str::find() 作为 James MeNellis 在他的答案中的文档,或者干脆......

    #include <cstring>
    
    for (std::string::const_iterator i = s.begin(); i != s.end(); ++i)
        if (std::strchr("*+{\\&", *i))
            handle_matching_character(*i);
        else
            handle_non_matching_character(*i);
    

    【讨论】:

      【解决方案2】:

      您可以轻松使用std::find 算法:

      const std::string alphabet = "abcdefghijklmnopqrstuvwxyz";
      
      bool is_in_alphabet 
                 = std::find(alphabet.begin(), alphabet.end(), 'c') != alphabet.end();
      

      或者,如果字母字符已排序,您可以使用std::binary_search,但除非字母表中有大量字符(即,超过 26 个),否则线性搜索可能会快得多。字符小,比较容易。

      【讨论】:

      • 当大小>=4时,线性搜索开始性能下降(与二分搜索相比)。大量字符的定义是什么? :)
      • @Jörgen:嗯,对于四个或更多字符,二分搜索理论上更快。 在实践中,即使对于例如32 个字符,有两个原因:一是线性搜索要简单得多,而且更有可能被编译器内联;二,二分查找中分支预测错误的几率比较高,而在线性查找中,分支预测并不重要。 1,024 个字符可能“对于二分搜索足够大”,而 32 个 i 可能“对于线性搜索足够小”;截止点可能取决于平台,我会对其进行分析以查看。
      • 我做了一些分析。对于最坏的情况,当 n > 4 时,二进制搜索每次都优于线性搜索。对于一般情况,当 n > 19 时,二进制搜索优于线性搜索。这很有意义(至少对我而言),因为二进制搜索代码相当“密集”并且与线性搜索具有同样多的条件分支,因此分支预测器不应该有那么大的影响。我在英特尔 Q9400 上使用 VS 2008 (/O2) 和 STL 的 find/binary_search 进行了分析。
      • @Jörgen:很有趣。几个月前,我对 Visual C++ 2010 和 Intel C++ 11.1 进行了类似的测试,得到了完全相反的结果:两个编译器都没有内联调用 std::binary_search,而在这两种情况下,std::find 的性能要高得多。
      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 2020-04-15
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多