Разделение букв алфавита в C ++ STL - PullRequest
3 голосов
/ 20 января 2011

Я тренировался на С ++ на соревнованиях на следующей неделе. И в примере задачи, над которой я работал, требуется разбить абзацы на слова. Конечно, это легко. Но эта проблема настолько странная, что такие слова, как: isn't, также должны быть разделены: isn и t. Я знаю, что это странно, но я должен следовать этому.

У меня есть функция split(), которая принимает разделитель constant char в качестве одного из параметров. Это то, что я использую, чтобы отделить слова от пробелов. Но я не могу понять это. Четные числа, такие как: phil67bs должны быть разделены как phil и bs.

И нет, я не прошу полный код. Подойдет псевдокод или что-то, что поможет мне понять, что делать. Спасибо!

PS: Пожалуйста, никаких рекомендаций для внешних библиотек. Просто STL. :)

Ответы [ 5 ]

4 голосов
/ 20 января 2011

Отфильтруйте числа, пробелы и все, что не является буквой, используя правильный языковой стандарт.Смотрите этот ТАК о том, что все, кроме чисел, следует рассматривать как пробел.Так что используйте mask и сделайте что-то похожее на то, что предлагает Джерри Коффин, но только для букв:

struct alphabet_only: std::ctype<char> 
{
    alphabet_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['A'], &rc['['], std::ctype_base::upper);
        std::fill(&rc['a'], &rc['{'], std::ctype_base::lower);
        return &rc[0];
    }
};

И, бум!Ты золотой.

Или ... ты мог бы просто сделать трансформацию:

char changeToLetters(const char& input){ return isalpha(input) ? input : ' '; }

vector<char> output;
output.reserve( myVector.size() );
transform( myVector.begin(), myVector.end(), insert_iterator(output), ptr_fun(changeToLetters) );

Который, к сожалению, гораздо проще поймать, но не так эффективно, как идея Джерри.1013 *

Редактировать:

Изменено «Z» на «[», так что значение «Z» заполняется.Аналогично с 'z' до '{'.

1 голос
/ 20 января 2011

Звучит как идеальная работа для функции find_first_of, которая находит первое вхождение набора символов.Вы можете использовать это для поиска произвольных символов остановки и генерации слов из пробелов между такими символами остановки.

Примерно:

size_t previous = 0;
for (; ;) {
    size_t next = str.find_first_of(" '1234567890", previous);
    // Do processing
    if (next == string::npos)
        break;
    previous = next + 1;
};
0 голосов
/ 20 января 2011

давайте предположим, что ввод находится в std::string (например, используйте std::getline(cin, line), чтобы прочитать полную строку из cin)

std::vector<std::string> split(std::string const& input)
{
  std::string::const_iterator it(input), end(input.end());
  std::string current;
  vector<std::string> words;
  for(; it != end; ++it)
  {
    if (isalpha(*it))
    { 
      current.push_back(*it); // add this char to the current word
    }
    else
    {
      // push the current word in to the result list
      words.push_back(current);
      current.clear(); // next word
    }
  }
  return words;
}

Я не проверял это, но я думаю, это должно работать ...

0 голосов
/ 20 января 2011

Вы можете сделать что-то вроде этого:

vector<string> split(const string& str)
{
    vector<string> splits;

    string cur;
    for(int i = 0; i < str.size(); ++i)
    {
        if(str[i] >= '0' && str[i] <= '9')
        {
            if(!cur.empty())
            {
                splits.push_back(cur);
            }
            cur="";
        }
        else
        {
            cur += str[i];
        }
    }
    if(! cur.empty())
    {
        splits.push_back(cur);
    }

    return splits;

}
0 голосов
/ 20 января 2011

Просто измените свою функцию, чтобы разделить все, что не является буквенным символом.Есть ли что-то конкретное, с чем у вас возникают проблемы?

Решите проблему: сначала напишите функцию, которая получает первое «слово» из предложения.Это просто;просто посмотрите на первый не алфавитный символ.Следующим шагом является удаление всех ведущих не алфавитных символов из оставшейся строки.Оттуда, просто повторите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...