Здравствуйте, gok, Вы писали:
gok>CString: 1:00
gok>STL: 2:45
надеюсь тестил в релизе, а иначе STL будет еще больше тормозить
Здравствуйте, bip29, Вы писали:
B> Народ не подскажет ли кто каким образом из строки убрать лишние пробелы и управляющие символы (\n,\r и др.). Мысль коечно есть но не хотелося б посимвольно читать строку. Может есть другие варианты. Хотелося б увидеть варианты на С или С++(не VCL,MFS b др).
B>Заранее благодарен.
Вот еще два гибрида C-style с C++-style:
Подход у них один — у первого оптимизация по скорости, у второго — по размеру
void eat_some_whitespaces2 (string & s)
{
string temp(s.size(), 0);
string::iterator curr = s.begin(),
end = s.end(),
out = temp.begin();
locale loc;
while (curr != end)
{
if (isspace(*curr, loc))
{
*out = ' ';
++out;
++curr;
while (curr != end)
{
if (isspace(*curr, loc)) ++curr;
else
{
*out = *curr;
++out;
++curr;
break;
}
}
}
else
{
*out = *curr;
++out;
++curr;
}
}
temp.resize(out - temp.begin());
s.swap(temp);
}
void eat_some_whitespaces3 (string & s)
{
string temp(s.size(), 0);
string::iterator curr = s.begin(),
end = s.end(),
out = temp.begin();
locale loc;
bool write = true;
while (curr != end)
{
if (isspace(*curr, loc))
{
if (write)
{
*out = ' ';
++out;
write = false;
}
++curr;
}
else
{
*out = *curr;
++out;
++curr;
write = true;
}
}
temp.resize(out - temp.begin());
s.swap(temp);
}
Надеюсь сделают всех

(в релизе естественно)
Если известно что строки contiguous вместо string::iterator можно написать char * (В 100% реализациях STL)
Здравствуйте, bip29, Вы писали:
char *space_deleter( char *s )
{
char *b=s,*p=s;
for(;*p;p++) if (*p==' ') *b++ = *p;
*b=0; return s;
}
char *trim_str( char *s , int l)
{
char *b=s,*p=s,*p2=s+l-1;
for(;*p;p++) if (*p==' ') *b++ = *p; else break;
for(;*p2==' ';p2--)*p2=0;
for(;*p;p++,b++) *b=*p;
*b=0; return s;
}
Здравствуйте, Pavel Chikulaev, Вы писали:
Ага, релиз, из-под 7.0.