Russian Qt Forum
Октябрь 02, 2024, 19:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление чисел с конца строки  (Прочитано 4057 раз)
Yuriy
Гость
« : Декабрь 06, 2011, 23:48 »

Простая задача. Нужно удалить числа с конца строки. Много перепробывал вариантов, сейчас остановился на этом:
Код:
while(nameForFind[nameForFind.length()-1].digitValue() != -1)
    nameForFind.chop(1);
Работает вроде бы неплохо, я вот думаю, может быть кто-нибудь уже сталкивался с подобной задачей и нашел более оптимальное/скоростное решение?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 06, 2011, 23:51 »

Зачем изменять строку на каждой итерации? Найди нужный индекс и с него удали.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Yuriy
Гость
« Ответ #2 : Декабрь 06, 2011, 23:54 »

Я честно говоря раньше не "заморачивался" на тему работы со строками и влегкую влепил бы сюда QRegExp к примеру, но после недавних экспериментов и потери производительности На 20-30%% из за вот таких нюансов начал "экономить на спичках". Создать счетчик на число найденных с конца числовых значений?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 07, 2011, 00:00 »

Код
C++ (Qt)
int index = str.size () - 1;
for (; index >=0 && str [index].isDigit (); --index) {
}
if (index > 0) {
 str.remove (index + 1, str.size ());
}
 
Уже засыпаю практически, это то, что пришло первое на ум.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Yuriy
Гость
« Ответ #4 : Декабрь 07, 2011, 00:09 »

Спасибо огромное! А то у самого голова не варит уже.
Записан
qt_user
Гость
« Ответ #5 : Декабрь 07, 2011, 01:39 »

помойму, лучше так:
Код
C++ (Qt)
int index = str.size () - 1;
for (; index >=0 && str [index].isDigit (); --index) {
}
++index;
if ( index >= 0 && index < str.size() ) {
 str.remove (index, str.size ());
}
 
Записан
Yuriy
Гость
« Ответ #6 : Декабрь 07, 2011, 01:54 »

А я сейчас вот так сделал, пока другим занимался, но все равно так и хочется вернуться к этой теме:
Код:
const int length = strlen(BaseName);
int index = length - 1;

while(isdigit(BaseName[index]) && index >=0) --index;
QString nameForFind = (index == -1) ? "undefined" : QString::fromAscii(BaseName,index+1);

в функцию приходит const char* и QString считывается с него только в нужных размерах. По-моему здорово, только не знаю этот самый isdigit() кроссплатформенный вообще Непонимающий
Записан
Yuriy
Гость
« Ответ #7 : Декабрь 07, 2011, 02:03 »

И вообще на asm в 15-20 тактов можно заколотить. Только вот собрать потом на бесплатном M& навряд ли получится. Смеющийся
Записан
qt_user
Гость
« Ответ #8 : Декабрь 07, 2011, 10:43 »

в функцию приходит const char* и QString считывается с него только в нужных размерах. По-моему здорово, только не знаю этот самый isdigit() кроссплатформенный вообще Непонимающий
если кодировки стоят правильно, то все будет нормально ( setCodecForCString() )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.198 секунд. Запросов: 23.