Open alexey-malov opened 9 years ago
class CRemoveExtraSpacesMachine
{
public:
typedef std::function<void(char)> charCallback_t;
CRemoveExtraSpacesMachine(charCallback_t callback);
void SendChar(char c);
static std::string RemoveExtraSpaces(std::string const& arg);
protected:
enum class state_t
{
START_POSITION,
SPACE_PENDING,
NOTHING_PENDING
};
static const char SPACE_CHAR = ' ';
state_t m_state;
charCallback_t m_callback;
};
protected заменить на private Используй UpperCamelCase для enum-ов и тайпдефов функций Вероятно нет нужды SendChar делать публичным.
std::string CRemoveExtraSpacesMachine::RemoveExtraSpaces(std::string const& arg)
{
std::string result;
CRemoveExtraSpacesMachine machine([&result](char c){ result.push_back(c); });
std::for_each(arg.begin(), arg.end(), [&machine](char c){ machine.SendChar(c); });
return result;
}
Лучше в результирующей строке сразу зарезервировать место, достаточное для хранения обработанной строки (метод reserve). Тогда класс строк при росте не будет перевыделять память Если использовать range-based for вместо for_each, то код, возможно, будет выглядеть читабельнее.
Вариант с целым классом конечноного автомата, в целом хорош. Но несколько переусложнен. Можно было бы обойтись обычной функцией, внутри которой содержался бы цикл. Если хочется универсальности, можно передать ей в качестве параметра тот же функциональный объект.
k=0,8 за исполнение и 1,1 за срок
Тут больше подходит макрос BOOST_CHECK_EQUAL