Re[7]: Удаление лишних пробелов в строке
От: Pavel Chikulaev Россия  
Дата: 15.06.05 04:30
Оценка:
Здравствуйте, gok, Вы писали:

gok>CString: 1:00

gok>STL: 2:45

надеюсь тестил в релизе, а иначе STL будет еще больше тормозить
Re: Удаление лишних пробелов в строке
От: Pavel Chikulaev Россия  
Дата: 15.06.05 06:18
Оценка:
Здравствуйте, 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)
Re[5]: Удаление лишних пробелов в строке
От: Анатолий Широков СССР  
Дата: 15.06.05 06:32
Оценка:
Здравствуйте, gok, Вы писали:

gok>Здравствуйте, Анатолий Широков, Вы писали:


АШ>>Просто у автора не совсем дописан функтор. Попробуй:


gok>Спасибо!


srez-а благодари, а не меня.
Re: Удаление лишних пробелов в строке
От: kaa_t Россия  
Дата: 15.06.05 08:57
Оценка:
Здравствуйте, 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; 
}
Re[8]: Удаление лишних пробелов в строке
От: gok Россия  
Дата: 15.06.05 18:36
Оценка:
Здравствуйте, Pavel Chikulaev, Вы писали:

Ага, релиз, из-под 7.0.
gok
Re[2]: Удаление лишних пробелов в строке
От: Pavel Chikulaev Россия  
Дата: 16.06.05 14:59
Оценка:
Здравствуйте, kaa_t, Вы писали:

[skipped]

А ты в курсе что это совсем не "Удаление лишних пробелов в строке"? Если да, то скажи зачем ты это запостил? C rulez?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.