![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]()
Эта тема не вопрос. Просто хочу поделиться находкой.
В общем предыстория такая. Есть текстовый файл размером в 1 мегабайт. Он состоит из строк размером до 1000 символов (варьируется). В этих строках, есть n-е количество одинаковых подстрок от 0 до 10-и. Задача: подсчитать все подстроки в этом файле. Задача интересна тем, что в AnsiString есть функция нахождения первого вхождения Pos, AnsiPos, но нет функции продолжения поиска. Странно, почему разработчики этого не предусмотрели? Первое, лобовое решение, которое пришло на ум, это удалять подстроки из строки. Очевидность неперспективности такого решения проявилась сразу. Прога "зависла" минут на 5. Связано это с тем, что проге необходимо бало сдвигать строки после удаления фрагмента. Попробовал перебором в двух фор-циклах. Задержка оказалась не столь значительной, всего минута. Я подумал, а нельзя-ли ещё ускорить её работу? Ведь большинство строк файла не содержит необходимой последовательности... И вот, что у меня родилось: Код:
Вот такие фокусы программирования!
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 30.12.2013 в 19:57. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
![]()
j=1;// У ансистринг всё начинается не с нуля
OMG. даже здесь у них сделано через (_|_) :facepalm: решение очевидно - выкинуть нах этот отстойный AnsiString (можно и сам C++ Builder заодно) и использовать кошерный std::string
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]()
Почему сразу так. Сам по себе, это очень даже неплохой класс. У него много полезных и легко реализуемыз методов. Но вот чего авторы не додумали, так это продолжение поиска в строке. Приходится через такие костыли делать.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 28.09.2013
Сообщений: 115
|
![]()
чуть-чуть поправить надо
while(j <= substring.Length()) действительно быстрее, в мегабайтном тексте 70000 вхождений посчитал за 80 мс вместо 3300 мс.
Что бы еще такого сделать, чтобы ничего не делать?
Последний раз редактировалось DpolenST; 30.12.2013 в 16:57. |
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]() Цитата:
Код поправил.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 30.12.2013 в 19:55. |
|
![]() |
![]() |
![]() |
#6 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]()
А что, в этом вашем Билдере нету PosEx?
В разработке: воспроизводственный контур ИТ
|
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 28.09.2013
Сообщений: 115
|
![]()
еще один момент не учтен
Код:
Код:
Что бы еще такого сделать, чтобы ничего не делать?
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]()
Возможно, это недокументированная функция. Во-всяком случае, я о ней не слышал и нигде она не описана. Проверю на досуге.
Не спорю, утилитка сырая. Многие аспекты не проверялись. Проверил только то, что она работает так, как мне было нужно.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 31.12.2013 в 20:05. |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 31.05.2010
Сообщений: 13,543
|
![]()
В мой код вкралась одна недоработочка, на которую мне указал в личке один хороший человек. И он прав. Привожу исправленный код:
Код:
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder Последний раз редактировалось Smitt&Wesson; 01.01.2014 в 10:10. |
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
в Дельфях PosEx это отдельная функция, находящаяся в модуле StrUtils(то есть отдельно от Pos), может и тут типа того?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Любимый наш с/с++ | OnixSonic | C/C++ Базы данных | 2 | 12.12.2012 15:51 |
Ошибка Unresolved external 'AVIA::AVIA(int, System::AnsiString, System::AnsiString, System::AnsiString, int) | mexmexmex | C++ Builder | 3 | 27.12.2011 13:31 |
Ваш любимый ЯП | Sna1L | Общие вопросы по программированию, компьютерный форум | 35 | 06.07.2011 07:48 |
любимый паскаль | ирен | Помощь студентам | 0 | 26.12.2010 10:29 |
Ваш любимый смайл | AngelOfDeath | Свободное общение | 14 | 04.01.2009 22:35 |