我需要做一个不区分大小写的查找,并找到以下代码来完成这个技巧
bool ci_equal(char ch1, char ch2)
{
return toupper((unsigned char)ch1) == toupper((unsigned char)ch2);
}
size_t ci_find(const string& str1, const string& str2)
{
string::const_iterator pos = std::search(str1. begin ( ), str1. end ( ), str2.
begin ( ), str2. end ( ), ci_equal);
if (pos == str1. end ( ))
return string::npos;
else
return pos - str1. begin ( );
}
这让我想知道如何使它成为'string'的成员函数,所以可以像这样调用它:
string S="abcdefghijklmnopqrstuv";
string F="GHI";
S.ci_find(F);
我意识到非英语语言中的案例转换存在许多问题,但这不是我感兴趣的问题。
作为一个新手,我很快就迷失在容器和模板中。
有没有这样做?有人能给我一个类似的例子吗?
答案 0 :(得分:10)
我认为大多数经验丰富的C ++程序员都会认为这是个糟糕的主意。如果有的话,std::string
已经有太多的成员函数,而添加更多会使情况变得更糟。更糟糕的是,如果你打算这样做,你可能会通过继承来实现它 - 但是std::string
并不是设计用作基类,而将它作为一个基类使用会导致代码脆弱并且容易出错。
关于如何执行此操作的另一个想法,您可能需要阅读Guru of the Week #29。不过,请阅读整篇文章,了解如何操作,和为什么你可能不想这样做。最终,您现在所拥有的可能是最佳选择 - 将不区分大小写的搜索与std::string
本身分开。
答案 1 :(得分:7)
std::string
不会被延长。
您可以将std :: string封装到您的类中,并在该类中设置这些成员函数。
答案 2 :(得分:6)
也许遵循标准库算法<algorithm>
方法可能是有益的。它不会让用户感到惊讶。 : - )
答案 3 :(得分:1)
大多数情况下,定义functor就足够了。 更具体地说,一个less-than comparator。的好处是仿函数和未修改的 string
类可以存储在STL容器中,STL将使用您的自定义仿函数进行操作。
这是一个具有默认构造函数和重载function call operator bool operator()(const string& x, const string& y)
的类
它执行不区分大小写的比较。
您还可以根据需要定义相等仿函数。
是的,不再可能在字符串类的对象上使用==
和<
运算符,而是需要创建一个仿函数的实例并像使用它一样使用它功能调用。但我不认为在C ++中还有其他选择。
编辑:我误解了这个问题。反应的不相关部分被删除。
编辑2:请完全无视我的回答......