- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
CStringUtf8::iterator& CStringUtf8::iterator::operator++()
{
m_ptr += CCharUtf8Ref::s_bytesForUTF8Sequence[*m_ptr];
return *this;
}
CStringUtf8 CStringUtf8::subString( size_t startChar, size_t count ) const
{
iterator start = this->begin();
while( start!=this->end() && startChar>0 )
{
start++;
startChar--;
}
iterator afterLast = start;
while( afterLast!=this->end() && count!=0 )
{
afterLast++;
count--;
}
return CStringUtf8( start.c_ptr(), afterLast.c_ptr() );
}
CStringUtf8::iterator CStringUtf8::findSubString( CStringUtf8 const& sample, CStringUtf8::iterator startFrom ) const
{
CStringUtf8::iterator pos = startFrom;
CStringUtf8::iterator foundPos = pos;
CStringUtf8::iterator samplePos = sample.begin();
for( ;; )
{
if( samplePos==sample.end() )
return foundPos;
if( pos==this->end() )
return this->end();
if( *samplePos == *pos )
{
if( samplePos==sample.begin() )
foundPos = pos;
samplePos++;
pos++;
}
else
{
if( samplePos==sample.begin() )
pos++;
samplePos = sample.begin();
}
}
}
std::vector<CStringUtf8> CStringUtf8::componentsSeparatedByString( CStringUtf8 const& separator ) const
{
std::vector<CStringUtf8> comps;
size_t sepLen = std::distance( separator.begin(), separator.end() );
size_t startPos = 0;
CStringUtf8::iterator itStart = begin();
if( sepLen > 0 )
{
CStringUtf8::iterator itEnd;
while( ( itEnd = findSubString( separator, itStart ) ) != end() )
{
size_t cnt = std::distance( itStart, itEnd );
CStringUtf8 str = subString( startPos, cnt );
comps.push_back( str );
itStart = itEnd;
std::advance( itStart, sepLen );
startPos += cnt + sepLen;
}
}
size_t cnt = std::distance( itStart, end() );
if( cnt > 0 )
{
CStringUtf8 str = subString( startPos, cnt );
comps.push_back( str );
}
return comps;
}
Привычный для всех плюсовиков велосипед по работе со строкой (походу свой в каждом проекте).
Более 10 лет не замечали тормоза в componentsSeparatedByString, который 100 Кб текст разбирал на строки за 5-10 сек (!!!).
bormand 26.04.2020 16:52 # 0
Да пофиг на тормоза, функция findSubString() вообще не рабочая. Попробуй найти "aab" в "aaab", к примеру.
Desktop 26.04.2020 17:09 # 0
jojaxon 26.04.2020 17:18 # 0
Тесты - это больная мозоль. Их мало, но они в тельняшках.
Rooster 26.04.2020 17:18 # 0
Не могла же она просуществовать 10 лет некорректная?
jojaxon 26.04.2020 17:20 # 0
Rooster 26.04.2020 17:26 # 0
У меня мозг протух.
Web_Monkey 26.04.2020 17:31 # 0
Ща говном кидатся начну! Уук! Уук! Кууик!
softpawww 26.04.2020 18:11 # 0
В чём логика передачи пустой строки как аргумента метода componentsSeparatedByString()? Куда разумнее здесь было бы бросить assert, нет? Если уж смысл в том, чтобы вернуть массив, содержащий единственный элемент, равный исходной строке (хотя, как мне кажется, логичнее при пустом аргументе было бы разбить всю строку по символам и вернуть массив этих символов), почему нельзя сделать отдельную проверку в самом начале с последующим простым возвратом из метода, вместо того чтобы считать размер строки и брать подстроку равную исходной строке?
subString() делает что-то уж совсем сложное, почему просто не сделать clamp() по 0, размеру строки и стартовому индексу и передать первым параметром со сдвигом по внутреннему указателю, а затем, аналогично, clamp() по 0, размеру строки и размеру подстроки, передав полученный результат со сдвигом по указателю вторым параметром в конструктор класса? Так нельзя?
Про findSubString() уже всё сказали выше. Опять же, я бы тоже не позволял просто так в метод передавать пустой аргумент в качестве строки поиска или делал бы такую проверку отдельно в самом начале и возвращал 0.
Я не особый специалист по плюсам, возможно, где-то херню написал.
Web_Monkey 26.04.2020 18:24 # 0
Не понимаю, в языке же есть поддержка процедурного программирования, почему её не используют?
Не понимаю, в языке же есть поддержка ФП, почему её не используют?
Не понимаю, в языке же есть поддержка АОП, почему её не используют?
Не понимаю, в языке же есть поддержка Си, почему её не используют?
Не понимаю, в языке же есть поддержка макросов, почему её не используют?
Не понимаю, в языке же есть поддержка шаблонов, почему её не используют?
Не понимаю, в языке же есть поддержка комплексных чисел, почему её не используют?
Как же без всего этого со строками то раьотать?
bormand 26.04.2020 18:26 # 0
guest8 26.04.2020 18:39 # −999
bormand 26.04.2020 18:42 # 0
guest8 26.04.2020 18:43 # −999
Needless 27.04.2020 16:33 # 0
Какой C++ )))
bormand 27.04.2020 16:35 # +1
Needless 27.04.2020 16:42 # 0
bormand 27.04.2020 16:43 # 0
jojaxon 27.04.2020 16:48 # +1
softpawww 27.04.2020 21:31 # 0
softpawww 27.04.2020 21:04 # 0
Ну вы тогда или крестик снимите, или штаны наденьте ) Или используйте ООП, или нет. А то набрали классов, а что с ними делать — хз )
jojaxon 27.04.2020 03:54 # +1
Пустые строки и впрямь никто не рассматривал. Возможно в тестах бы и проверили, но тестов нет. Любой, кто будет передавать пустые строки - ССЗБ.
subString() отсчитывает кодепоинты и выдергивает подстроку, передавая указатели в конструктор. Считаю, что передавать позицию в кодепоинтах также бессмысленно как и считать в них длину строки.
clamp в 2005 не было. Описанный алгоритм не понял, почитаю позже.
Кстати проблема с тормозами решилась добавлением версии subString() с итераторами.
softpawww 27.04.2020 21:18 # 0
Как же вы можете доверять работе написанного кода, если у вас все предусловия прописаны неявно и никак не контролируются? Вы же не будете рассказывать каждому новому программисту о том, какая специфика работы каждого из написанных методов? ) Или у вас подробная документация есть? Но даже если так, документацию к классам читают обычно, когда что-то не работает, по-хорошему, интерфейс должен работать предсказуемым образом )
Да, вряд ли кто-то явно будет передаст указатели друг на друга в качестве параметров, но ведь любая ошибка в связанном коде — и они могут там оказаться.
Я понимаю, что это не ваш код, но и защищать его по принципу «это не код небезопасный, а программист глупый» тоже не очень правильно )
> subString() отсчитывает кодепоинты и выдергивает подстроку, передавая указатели в конструктор. Считаю, что передавать позицию в кодепоинтах также бессмысленно как и считать в них длину строки.
Я понял, ошибся, перепутал размеры сдвига у итератора с переданным размером строки.
> clamp в 2005 не было.
Он реализуется в одну-две строки ) Но не суть.
jojaxon 27.04.2020 16:43 # 0
gost 27.04.2020 16:46 # 0
This.