- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用stl编程-read
区域设置和忽略大小写的字符串比较
条款35解释了怎样使用mismatch和lexicographical_comapre实现忽略大小写的字符串比较,但是它也指出一个真正通用的解决方案必须考虑区域设置。本书是关于STL的,而非国际化的,因此我几乎没有提到任何关于区域设置的东西。不过,Matt Austern,《Generic Programming and the STL》[4]的作者,在2000年5月《C++ Report》[11]的专栏里提到了涉及区域设置的忽略大小写字符串比较。为了完整地讲述这个重要的主题,我很高兴能在这里再版他的专栏,而且我感谢Matt和101communications准许我这么做。
如何进行忽略大小写的字符串比较Matt Austern
如果你写的程序曾经用到过string(谁没有吗?),有时候可能你需要处理两个除了大小写不同其他都相同的字符串。即,你需要让比较——相等、小于、子串匹配、排序——都忽略大小写。而且,的确,关于标准C++库的最常见问题之一是怎样使string忽略大小写。这个问题已经被回答很多次了。很多答案是错误的。
首先,让我们放弃试图写忽略大小写string类的想法。是的,它在技术上多多少少是可能的。标准库类型std::string其实只是一个模板std::basic_stringchar, std::char_traitschar, std::allocatorchar 的别名。所有的比较都使用了特性参数,所以,通过提供一个正确地重定义了相等和小于的特性参数的方法,你可以实例化basic_string,使和==操作符是忽略大小写的。你可以这么做,但没必要那么麻烦。
你将不能做I/O,至少不能再没有很多痛苦的情况下进行。标准库里的I/O类,比如std::basic_istream和std::basic_ostream,与std::basic_string一样在字符类型和特性上模板化。(再次强调,std::ostream只是一个std::basic_ostreamchar, char_traitschar 的别名。)特性参数必须匹配。如果你对字符串使用std::basic_stringchar, my_traits_class,你就必须对流使用std::basic_ostreamchar, my_traits_class。你不能使用比如cin和cout那样普通的流对象。
忽略大小写不涉及一个对象,而涉及你怎样使用一个对象。你可能在一些情况下非常需要把一个string当作关注大小写而在其他情况下忽略大小写。(或许取决于用户控制的选项。)为这两种应用定义不同的类型是在它们之间放置人造障碍。
它并不合适。正如所有的特性类[1],char_traits是小的、简单的和无状态的。我们可以在本专栏的后面看到,正确的忽略大小写比较不是这样的东西。
它不够。即使所有basic_string本身的成员函数都忽略大小写,当你需要使用非成员泛型算法比如std::search和std::find_end时,将仍然没有帮助。如果你决定,出于效率的考虑,从basic_string对象的容器改为字符串表,它也将没有帮助。
更自然地融合入标准库设计的更好的解决方案是在当你需要时才进行忽略大小写的比较。不要为string::find_first_of和string::rfind那样的成员函数而烦恼;它们的功能都存在于非成员泛型算法。同时,泛型算法灵活得足以适应忽略大小写的字符串。例如,如果你需要以忽略大小写的顺序排序一个字符串的集合,你需要做的就是提供适当的比较函数对象:
std::sort(C.begin(), C.end(), compare_without_case);
本专栏的剩余部分将致力于怎样写那个函数对象。
第一次尝试
有不止一种方法来按字母顺序排列单词。下次你在书店时,注意作者的名字是怎么安排的:Mary McCarthy在Bernard Malamud之前,还是之后?(这是习惯的问题,而且这两种方式我都看到过。)但是,字符串比较的最简单方式是我们都在小学学过的那个:词典或者“字典顺序”比较,我们从一个一个字符的比较建立了字符串比较。
词典比较可能不适合专业应用(不是唯一的方法;库可能以不同的方式排序人名和地名),但它适合大部分情况,而且这是字符串比较在C++里的默认意思。字符串是字符的序列,如果x和y的类型是std::string,表达式x y等价于这个表达式
std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()).
在这个表达式中,lexicographical_compare使用operator比较单个字
文档评论(0)