расширение строковых функций c ++ - PullRequest
9 голосов
/ 22 августа 2010

Мне нужно было найти регистронезависимый поиск, и я нашел следующий код, который сделал трюк

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 ]

10 голосов
/ 22 августа 2010

Я думаю, что большинство более опытных программистов на C ++ согласятся, что это плохая идея.Во всяком случае, std::string уже имеет слишком много функций-членов, и добавление еще большего ухудшит плохую ситуацию.Что еще хуже, если бы вы собирались сделать это, вы, вероятно, сделали бы это с помощью наследования - но std::string не предназначен для использования в качестве базового класса, и использование его как единого приведет к хрупкому коду и ошибке-prone.

Для еще одной идеи, как это сделать, вы можете прочитать Гуру недели # 29 .Тем не менее, прочитайте всю статью, чтобы понять, как это сделать, и , почему вы, вероятно, этого не хотите.В конечном счете, то, что у вас есть сейчас, вероятно, является наилучшим вариантом - держите поиск без учета регистра отдельно от std::string.

8 голосов
/ 22 августа 2010

std::string не предназначен для расширения.

Вы можете инкапсулировать std :: string в свой класс и установить эти функции-члены в этом классе.

6 голосов
/ 22 августа 2010

Возможно, следование методологии Стандартных библиотек <algorithm> может быть полезным.Это не удивит пользователей.: -)

Функции алгоритма в качестве примера.

1 голос
/ 22 августа 2010

В большинстве случаев будет достаточно определить функтор . В частности, компаратор меньше, чем . Преимущество заключается в том, что функтор вместе с неизменным классом stringхраниться в контейнерах STL, и STL будет использовать ваши пользовательские функторы для операций.

Это класс с конструктором по умолчанию и перегруженным оператором вызова функции
bool operator()(const string& x, const string& y)
который выполняет сравнение без учета регистра.

Вы также можете определить функтор равенства в зависимости от ваших потребностей.

Правда, больше нельзя использовать == и< операторы буквально на объектах вашего строкового класса, вместо этого вам нужно будет создать экземпляр функтора и использовать его как вызов функции.Но я не думаю, что есть другая альтернатива в C ++.

Отредактировано: я неправильно понял вопрос.Нерелевантная часть ответа удалена.

Отредактировано 2: Пожалуйста, полностью игнорируйте мой ответ ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...