Здравствуйте, Аноним, Вы писали:
А>Ээ-э... А можно пояснить? И при чем тут буст? Неужели в STL нет стандартных средств для такой элементарной операции?
А зачем тебе именно в STL нужно?
А>Ээ-э... А можно пояснить? И при чем тут буст? Неужели в STL нет стандартных средств для такой элементарной операции?
ну разве не понятно?
в привидённом коде делается std::search по бинарному предикату std::tolower от твоих символов входных строк, так что никаких временных строк не создаётся, а поэтому- это более бысрый и удачный вариант, чем преобразование обоих строк к одному регистру и последующему их сравнению.
Здравствуйте, Аноним, Вы писали:
А>Как выполнить сабж в STL?
В STL нет (или пока нет) встроенного сравнения без учета регистра, если необходимо выполнить только одно сравнение см. выше подсказки, а если идет много работы со строками и надо без учета, то надо создать специльный тип строки со своим кодом трактовки символа см. basic_string<>
Здравствуйте, Аноним, Вы писали:
А>Как выполнить сабж в STL?
Написать функтор, который будет сравнивать без учёта регистра (с использованием tolower,toupper) и использовать его, когда нужно сравнить строки.
Re[2]: сравнение строк без учета регистра
От:
Аноним
Дата:
24.07.07 11:07
Оценка:
Здравствуйте, Alex Dav, Вы писали:
А>>Как выполнить сабж в STL?
AD>В STL нет (или пока нет) встроенного сравнения без учета регистра, если необходимо выполнить только одно сравнение см. выше подсказки, а если идет много работы со строками и надо без учета, то надо создать специльный тип строки со своим кодом трактовки символа см. basic_string<>
А подробнее можно? Что это значит, заменить char на что-то другое? И чем это поможет в сравнении?
Re[2]: сравнение строк без учета регистра
От:
Аноним
Дата:
24.07.07 11:18
Оценка:
Здравствуйте, alzt, Вы писали:
А>>Как выполнить сабж в STL?
A>Написать функтор, который будет сравнивать без учёта регистра (с использованием tolower,toupper) и использовать его, когда нужно сравнить строки.
Такие "функторы" уже есть — stricmp — но не очень хочется чтобы программа была заполнена такими "элегантными" строками вида
Хочется просто использовать знак сравнения, в крайнем случае функцию возвращающую bool. Исходя их духа ООП все (или большинство) методов std::string должны быть виртуальными чтобы можно было легко переопределить их для своих целей — но почему-то Страуструп, пропагандируя такой подход в теории, в STL решил от него отказаться.
И вообще — я честно пытаюсь заставить себя писать на C++, но пока что ваши ответы не дают мне повода для оптимизма.
Re[3]: сравнение строк без учета регистра
От:
Аноним
Дата:
24.07.07 11:33
Оценка:
Здравствуйте, Аноним, Вы писали:
А>И вообще — я честно пытаюсь заставить себя писать на C++, но пока что ваши ответы не дают мне повода для оптимизма.
AD>вот второй параметр это и есть трактовка символа, т.е. как я понимаю, это твое представление символа, код для примера
AD>
AD>#include <string>
AD>#include <iostream>
AD>#include <cctype>
AD>using namespace std;
AD>struct onlyuppercase_tract : public std::char_traits<char>
AD>{
AD> //дальше замещаем нужные функции типа
ADAD>//и т.д.
AD>};
AD>
Там походу много чего еще, стремабельность добавить. Потом эта новая строка никак не совместима с std::string. И замена алокатора к таком уже эффекту приведет. Ставнимость с учетом регистра потеряна. Кстати ноль всеравно стоит вконце std::string, c_str не дорогая операция
Здравствуйте, Аноним, Вы писали:
А>Там походу много чего еще, стремабельность добавить. Потом эта новая строка никак не совместима с std::string. И замена алокатора к таком уже эффекту приведет. Ставнимость с учетом регистра потеряна. Кстати ноль всеравно стоит вконце std::string, c_str не дорогая операция
Я не говорил что это лучший выход — все зависит от ваших потребностей, но если вам нужен строковой тип все операции с котором должны выполняться таким образом, то это самое оно. А что значит не совместим добавить самому оператор преобразования к string и будет.
Re[2]: сравнение строк без учета регистра
От:
Аноним
Дата:
26.07.07 15:32
Оценка:
Здравствуйте, Sni4ok, Вы писали:
S>вот так например
S>
В С++ не силен но все же хотел спросить — почему нету проверки на то не ссылаются ли стринги на один и тот же обьект?
Ну и просто такой вопрос — а не выгодней было-бы сделать метод который бы не просто сравнивал но еще и говорил бы как обьект больше?
Здравствуйте, <Аноним>, Вы писали:
А>Как выполнить сабж в STL?
Скотт Мейерс: Эффективное использование STL. Совет #35. Еще вот хоть убей, не помню в какой из musthave книг описывалось создание класса на основе basic_string, но со сравнением строк без учета регистра. А пересматривать все лень
Здравствуйте, <Аноним>, Вы писали:
А>Хочется просто использовать знак сравнения, в крайнем случае функцию возвращающую bool. Исходя их духа ООП все (или большинство) методов std::string должны быть виртуальными чтобы можно было легко переопределить их для своих целей — но почему-то Страуструп, пропагандируя такой подход в теории, в STL решил от него отказаться.
Дух ООП не пропагандирует наследование Наследование подразумевает очень сильную связанность. Поэтому чаще всего лучше от него отказаться. Но это не мне нужно рассказывать — об этом нужно читать и понимать.
P.S. Вот что значит — давно не включать RSDN@Home. Теперь я не знаю, ответили ли на это сообщение, или еще нет. И пока все не докачается, не узнаю
Здравствуйте, Peregrin, Вы писали:
А>>Как выполнить сабж в STL?
Смотря на что сравнить — на равенство или на порядок.
P>Сделать обоим строкам tolower/toupper и сравнить.
Не будет работать.
Простейший пример. В французском языке буквы с диакритикой могут при переводе в uppercase её терять. Соответственно, буквы "Latin small letter A" и "Latin small letter A with acute" после toupper станут эквивалентными, в то время как исходно между ними был порядок (буква без диакритики стоит перед буквой с диакритикой).
Или, скажем, в японском языке слово может быть написано одной из двух слоговых азбук — хираганой или катаканой. Катакана используется для написания заимствованных слов, а также для выделения. Соответственно, регистронезависимое сравнение должно считать хирагану и катакану эквивалентными. Однако и tolower, и toupper оставят хирагану хираганой, а катакану катаканой.