- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
如何忽略大小写比较字符串
如何忽略大小写比较字符串 Matt Austern 著 hotman_x 译
如何忽略大小写比较字符串
Matt Austern 著
hotman_x 译
hotman_x 曰:趁春节这几天,乱翻一气,也有翻不出来写原文的,也有“以意逆志”乱猜的,总之,姑
妄译之,如果有兴趣,不妨姑妄读之。
--2006.02.05
如果你写过用到了字符串的程序 (谁没写过?),就有可能遇到过这种情
况:视 个仅大小写有差异的字符串为相同。也就是说,你会需要无视大小写
的相等性比较、小于比较、子串匹配、排序。而且,说真的,关于标准C++库
最常见的问题之一就是 “如何忽略大小写比较字符串”。这个问题被问了很多
次,而且被答错了很多次。
首先,你可能正在琢磨写一个 “大小写无关字符串类”的法子,让我们来
看看:是 的,这在技术上是多少还是有点可能性的。标准库类型
std::string其实不过是这个模板的别名:std::basic_stringchar,
std::char_traitschar, std::allocatorchar 。它用traits
参数进行所有的比较,即:提供 “重新定义好的进行相等性比较、小于比较”
的traits 参数,你就可以以此方式来实例化basic_string,这样一来,
和==运算符就是大小写无关的了。你可以这么干,但是如此伤神实在划不来:
• 你没法做I/O——至少不吃点苦头是做不了。标准库中的I/O类,如
std::basic_istream 和 std::basic_ostream , 也 和
std::basic_string 一样,是用字符类型及相关traits 来参数化的。
(再 说 一 次 , std::ostream 仅 仅 是 它 的 别 名 :
std::basic_ostreamchar, char_traitschar
。 )Traits 参数必须完全 匹配。如果你 的字符 串用 的是
std::basic_stringchar, my_traits_class ,那么你的流输
出 就 得 相 应 的 用 std::basic_ostreamchar,
my_traits_class,这么一来,你就不能用cin、cout这样常用的
1
如何忽略大小写比较字符串 Matt Austern 著 hotman_x 译
流对象。
• “大小写无关”这个特性其实与对象无涉,而是与 “如何使用对象
”相关。你可能非常需要在此处不关心大小写而在彼处关心 (比如说 “
大小写无关”是一个用户控制的选项)。为这 种情况搞出 个单独的
类型出来,实在是在这两者之间不必要的人为设限。
• 不大恰当。同其它traits 类 一样,char_traits是一个小巧、1
简单、无状态的类。在后面的讨论中我们会看到,能正确的进行大小写
无关比较的类决不可能具有这样的特性。
• 不充分。即使所有basic_string 的成员函数都大小写无关了,当
你 需 要 用 一 个 非 成 员 的 泛 型 算 法 (如 std::search 和
std::find_end)时还是用不上劲。如果为了提高效率,你决定将容纳
basic_string对象的容器换成字符串表格,你又用不上劲。
更好的解决之道,也是更符合标准库习惯的解决之道,应该是:在需要时
明 确 的 要 求 进 行 大 小 写 比较 。 象 string::find_first_of 和
st
文档评论(0)