#c builder #unicode-string
Вопрос:
В проекте, над которым я работаю, используя Embarcadero C Builder, все исходные файлы используются UnicodeString
при использовании строк.
Я нашел этот фрагмент для удаления символов из std::wstring
:
#include <cctype>
#include <algorithm>
#include <string>
//...
std::wstring FileHandler::removePunctuation(std::wstring word)
{
word.erase(std::remove_if(word.begin(), word.end(),
[](char ch){ return !::iswalnum(ch); }), word.end());
return word;
}
Но как мне применить тот же алгоритм к UnicodeString
? Или, есть ли аналогичная функция с реализацией?
Ответ №1:
UnicodeString
имеет begin()
и end()
итераторы, поэтому вы можете использовать std::remove_if()
точно так же, как и с std::wstring
.
Однако UnicodeString
у него нет erase()
метода на основе итератора, как std::wstring
у него, но у него есть Delete()
метод на основе индекса. std::removee_if()
просто переместите «удаленные» символы в конец строки, чтобы вы могли использовать remove_if()
возвращаемый итератор для вычисления начального индекса для удаления, например:
#include <cctype>
#include <algorithm>
//...
UnicodeString FileHandler::removePunctuation(UnicodeString word)
{
auto iter = std::remove_if(word.begin(), word.end(),
[](WideChar ch){ return !::iswalnum(ch); });
// Note: UnicodeString indexes start at 1, not 0!!
word.Delete(std::distance(word.begin(), iter) 1, MaxInt);
return word;
}