扩展c ++字符串成员函数

时间:2010-08-22 15:31:24

标签: c++ string

我需要做一个不区分大小写的查找,并找到以下代码来完成这个技巧

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);

我意识到非英语语言中的案例转换存在许多问题,但这不是我感兴趣的问题。

作为一个新手,我很快就迷失在容器和模板中。

有没有这样做?有人能给我一个类似的例子吗?

4 个答案:

答案 0 :(得分:10)

我认为大多数经验丰富的C ++程序员都会认为这是个糟糕的主意。如果有的话,std::string已经有太多的成员函数,而添加更多会使情况变得更糟。更糟糕的是,如果你打算这样做,你可能会通过继承来实现它 - 但是std::string并不是设计用作基类,而将它作为一个基类使用会导致代码脆弱并且容易出错。

关于如何执行此操作的另一个想法,您可能需要阅读Guru of the Week #29。不过,请阅读整篇文章,了解如何操作,为什么你可能不想这样做。最终,您现在所拥有的可能是最佳选择 - 将不区分大小写的搜索与std::string本身分开。

答案 1 :(得分:7)

std::string不会被延长。

您可以将std :: string封装到您的类中,并在该类中设置这些成员函数。

答案 2 :(得分:6)

也许遵循标准库算法<algorithm>方法可能是有益的。它不会让用户感到惊讶。 : - )

Algorithm Functions为例。

答案 3 :(得分:1)

大多数情况下,定义functor就足够了。 更具体地说,一个less-than comparator的好处是仿函数未修改的 string类可以存储在STL容器中,STL将使用您的自定义仿函数进行操作。

这是一个具有默认构造函数和重载function call operator bool operator()(const string& x, const string& y)的类 它执行不区分大小写的比较。

您还可以根据需要定义相等仿函数。

是的,不再可能在字符串类的对象上使用==<运算符,而是需要创建一个仿函数的实例并像使用它一样使用它功能调用。但我不认为在C ++中还有其他选择。

编辑:我误解了这个问题。反应的不相关部分被删除。

编辑2:请完全无视我的回答......