Форум программистов, компьютерный форум CyberForum.ru

Класс, который удаляет из строки все пробелы - C++

Восстановить пароль Регистрация
 
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
17.03.2012, 02:37     Класс, который удаляет из строки все пробелы #1
Нужен класс, который удаляет из строки все пробелы.
Как сие лучше реализовать?
Придумалось вот такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
#include <algorithm>
 
class EraseChar
{
    // Удаляемый символ
    enum{CHAR = ' '};
    // Это сама строка
    std::string str;
    // Функция удаляет из строки str символ CHAR
    void eraseChar() {
        str.erase(std::remove(str.begin(), str.end(), CHAR), str.end());
    }
public:
    EraseChar(){}
    EraseChar(std::string& s): str(s) {eraseChar();}
    EraseChar(char* pch): str(pch) {eraseChar();}
    operator const std::string& () const {return str;}
};
int main ()
{
    std::string s(" He ll o, wo rld ! ");
    EraseChar ec(s);
    s = ec;
    std::cout << s << std::endl;
    ec = " I S D ";
    std::cout << (std::string)ec << std::endl;
}
Добавлено через 19 минут
А может лучше как-то через статическую функцию реализовать?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2012, 02:37     Класс, который удаляет из строки все пробелы
Посмотрите здесь:

C++ написать программу, которая удаляет из введенной с клавиатуры строки начальные пробелы
Функция удаляет начальные пробелы из строки... C++
C++ Программа, которая удаляет из введенной с клавиатуры строки начальные пробелы
Написать функцию, которая удаляет все лишние пробелы C++
C++ Описать функцию, которая удаляет из строки все лишние пробелы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
17.03.2012, 02:49     Класс, который удаляет из строки все пробелы #2
Цитата Сообщение от Konstantin_D Посмотреть сообщение
Как сие лучше реализовать?
Такой класс имеет смысл делать только в виде функтора.
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
17.03.2012, 03:14  [ТС]     Класс, который удаляет из строки все пробелы #3
Так?
C++
1
2
3
4
5
6
7
8
9
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
#include <iostream>
#include <string>
#include <algorithm>
 
class EraseChar
{
    // Удаляемый символ
    char ch;
    // Это сама строка
    std::string str;
    // Функция удаляет из строки str символ CHAR
    void eraseChar() {
        str.erase(std::remove(str.begin(), str.end(), ch), str.end());
    }
public:
    EraseChar(char chr = ' '): ch(chr) {}
    const std::string& operator()(char* pch) {
        str = std::string(pch); 
        eraseChar();
        return str;
    }
    const std::string& operator()(std::string& s) {
        str = s; 
        eraseChar();
        return str;
    }
    operator const std::string& () const {return str;}
};
int main ()
{
    EraseChar ec;
    std::string s(" He ll o, wo rld ! ");
    s = ec(s);
    std::cout << s << std::endl;
}
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.03.2012, 03:53     Класс, который удаляет из строки все пробелы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <functional>
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
 
class erase_char : public std::unary_function<std::string, void> {
   char symb;
public:
   explicit erase_char(char c) : symb(c) {}
   void operator () (std::string& s) const
   {
      s.erase(std::remove(s.begin(), s.end(), symb), s.end());
   }
};
 
int main()
{
    std::vector<std::string> vec = { "H   ell o ", "  wor         ld", "thi  s", "  i   s  " };
    std::for_each(vec.begin(), vec.end(), erase_char(' '));
    std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
Konstantin_D
 Аватар для Konstantin_D
14 / 14 / 2
Регистрация: 21.07.2011
Сообщений: 89
17.03.2012, 04:54  [ТС]     Класс, который удаляет из строки все пробелы #5
Цитата Сообщение от Jupiter Посмотреть сообщение
C++
1
    std::vector<std::string> vec = { "H   ell o ", "  wor         ld", "thi  s", "  i   s  " };
error: 'vec': non-aggregates cannot be inialised with initializer list

Добавлено через 6 минут
Немного упростился класс, но как его теперь заставить с Си-строками работать?
C++
1
erase_char ec(' '); ec("H   ell o ");
Добавлено через 28 минут
И где возникнут проблемы при работе функтора (или предиката) с STL, если он не наследован от классов unary_function и binary_function?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
17.03.2012, 12:20     Класс, который удаляет из строки все пробелы #6
Цитата Сообщение от Konstantin_D Посмотреть сообщение
error: 'vec': non-aggregates cannot be inialised with initializer list
Эта возможность появилась в последней версии стандарта С++(С++11), ваш компилятор может этого не поддерживать.

Цитата Сообщение от Konstantin_D Посмотреть сообщение
Немного упростился класс, но как его теперь заставить с Си-строками работать?
C++
1
erase_char ec(' '); ec("H ell o ")
C++
1
2
3
4
5
6
void operator()(char* s) const
{
   size_t n = std::strlen(s);
   char* end = std::remove(s, s + n, symb);
   *end = '\0';
}
естественно это касается символьных массивов, а не строковых литералов.
Цитата Сообщение от Konstantin_D Посмотреть сообщение
И где возникнут проблемы при работе функтора (или предиката) с STL, если он не наследован от классов unary_function и binary_function?
При использовании совместно с std::not1, std::bind1st и т.д. В данном случае практической пользы от наследования нет.
Yandex
Объявления
17.03.2012, 12:20     Класс, который удаляет из строки все пробелы
Ответ Создать тему
Опции темы

Текущее время: 07:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru