- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
string Delimiter(string Text, int Index, const char* Delimiter) {
int n = 0, find = 0;
for (int i = 0; i <= Index; i++) {
find = Text.find(Delimiter, n);
if (i == Index) {
return Text.substr(n, find - n);
}
n = find + 1;
}
return "";
}
defecate-plusplus 18.01.2012 09:36 # +1
FalseCoder 18.01.2012 21:34 # 0
ctm 19.01.2012 07:57 # 0
кстати, еще вопрос. где используется эта функция? если размер строки может измеряться сотнями килобайт, то вообще стоит написать что-то вроде
string NextDelimiter(const string Text, int &idx, const char *delimiter){...}
и перебор в таком виде: for(int i = 0; i >= 0;) NextDelimiter(Text, i, ",");
да, еще разделитель строка или символ (реально что используется)?
defecate-plusplus 19.01.2012 09:33 # 0
ctm 19.01.2012 10:22 # 0
поясню. искать таким образом i-й кусок строки. тут же даже не квадратичная сложность (учитывая внешний цикл). а можно добиться близкого к линейному.
понятно что все это имеет смысл при больших объемах данных. для разового разбора строки из 100 символов и так пойдет.
defecate-plusplus 19.01.2012 10:29 # 0
я в курсе, что существуют хорошие алгоритмы поиска подстроки в строке, на той же педивикии с десяток рассмотрено
при этом алгоритм в лоб обычно удовлетворителен, в зависимости какая задача и какие требования к производительности
только вот если делимитер вовсе не подстрока, а чар/набор чаров, то готовые решения гораздо предпочтительней очередного велосипеда - начиная от банального сишного strtok (thread safe/unsafe варианты) - есть у всех, заканчивая boost::split/boost::tokenize у тех, кому повезло
зы - алгоритм в лоб конечно != коду в топике