Я обновляю программу, которую написал почти два года назад, и я столкнулся с вызовом, чтобы удалить все знаки препинания и пробелы из строки.Удаление вопроса о пунктуации
Звонок работает нормально, но я не уверен, что это самый эффективный способ сделать это.
Строка кода ниже:
tempMessage.erase(remove_if(tempMessage.begin(), tempMessage.end(), (int(*)(int))ispunct), tempMessage.end());
У меня нет никаких воспоминаний о том, где я придумал это или как он был поставлен вместе, но я хочу, чтобы иметь возможность полностью понять этот вызов.
Получаю, что std :: string.erase избавляется от первого аргумента до второго аргумента. Я также вижу, как remove_if определяет начальную и конечную точки, но может ли кто-нибудь сказать мне, откуда идет третий аргумент в вызове remove_if?
Я не могу вспомнить, почему (int (*) (int)) требуется для жизни меня.
Пока вы смотрите на код, может ли кто-нибудь улучшить это или сделать его более эффективным?
Thanks
Кажется, что я искал быстрое решение в то время, и это сработало. Не могли бы вы объяснить структуру, которую вы определили в своем ответе, немного больше? Похоже, что он возвращает true, если char является символом punct, но я не понимаю два полуколона перед развязным вызовом. Я также не очень хорошо знаком с реализацией bool operator() const. Не могли бы вы также расширить это? Извините за хлопот. – Matthew
Нет проблем. '::' - оператор разрешения области. Он просто гарантирует, что мы получаем 'ispunct' из'', а не другой. (Это не обязательно здесь.) 'Bool operator() (...)' - оператор вызова функции: это означает, что компилятор может «вызывать» объект, как если бы он был функцией. Такие объекты называются функциональными объектами или функторами и широко используются в C++. –
Просто для моей собственной ясности. как передается 'char' в' int ispunct (int ch) 'undefined поведение, но передача' unsigned char' is * not *? Является ли первое не охваченным результатом интегральных повышений в стандарте (4.5/4.7), а если нет, то как последний? – WhozCraig