Я думаю, что сделал бы работу немного по-другому. Поскольку вы хотите игнорировать все, кроме буквенно-цифровых символов, я бы начал с определения локали, которая обрабатывает все остальные символы как пробел:
struct digits_only: std::ctype<char> {
digits_only(): std::ctype<char>(get_table()) {}
static std::ctype_base::mask const* get_table() {
static std::vector<std::ctype_base::mask>
rc(std::ctype<char>::table_size,std::ctype_base::space);
std::fill(&rc['0'], &rc['9'], std::ctype_base::digit);
std::fill(&rc['a'], &rc['z'], std::ctype_base::lower);
std::fill(&rc['A'], &rc['Z'], std::ctype_base::upper);
return &rc[0];
}
};
Это делает чтение слов / чисел из потока довольно тривиальным. Например:
int main() {
char const test[] = "This is a bunch=of-words and 2@numbers#4(with)stuff to\tseparate,them, I think.";
std::istringstream infile(test);
infile.imbue(std::locale(std::locale(), new digits_only));
std::copy(std::istream_iterator<std::string>(infile),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
На данный момент я скопировал слова / числа в стандартный вывод, но копирование в вектор просто означает предоставление другого итератора для std::copy
. Для реального использования мы, несомненно, хотели бы получить данные из std::ifstream
, но (опять же) это просто вопрос предоставления правильного итератора. Просто откройте файл, наполните его языком и прочитайте ваши слова / цифры. Все знаки препинания и т. Д. Будут автоматически игнорироваться.