Я хотел бы знать, как удалить повторяющиеся строки из контейнера, но игнорировать различия слов от конечной пунктуации.
Например, учитывая эти строки:
Почему мы здесь?
Я хотел бы получить этот вывод:
Почему мы здесь?
Алгоритм:
использование std::string
за ваше слово.
Это позволяет вам сделать следующее:
std::string word;
while (data_file >> word)
{
}
использование std::vector
содержать ваши слова (хотя вы могли бы использовать std::list
также). std::vector
растет динамически, поэтому вам не нужно беспокоиться о перераспределении, если вы выбрали неправильный размер.
Добавить к std::vector
, использовать push_back
метод.
Сравнивать std::string
использовать operator==
:
std::string new_word;
std::vector<std::string> word_list;
//...
if (word_list[index] == new_word)
{
continue;
}
Так Вы сказали Вы знаете, как маркировать строку. (Если вы не проводите здесь некоторое время: https://stackoverflow.com/a/38595708/2642059) Так что я собираюсь предположить, что нам дали vector<string> foo
который содержит слова с возможной конечной пунктуацией.
for(auto it = cbegin(foo); it != cend(foo); ++it) {
if(none_of(next(it), cend(foo), [&](const auto& i) {
const auto finish = mismatch(cbegin(*it), cend(*it), cbegin(i), cend(i));
return (finish.first == cend(*it) || !isalnum(*finish.first)) && (finish.second == cend(i) || !isalnum(*finish.second));
})) {
cout << *it << ' ';
}
}
Здесь стоит отметить, что вы не дали нам правил о том, как обрабатывать такие слова, как: «вниз», «понижающий голос» и «понижающий голос». Этот алгоритм предполагает, что 1улица 2 равны. Вы также не дали нам правила поведения: «Почему мы здесь, здесь?» Этот алгоритм всегда возвращает окончательное повторение, поэтому вывод будет «Почему мы здесь?»
Если предположения, сделанные этим алгоритмом, не совсем вам нравятся, оставьте мне комментарий, и мы постараемся помочь вам освоить этот код, чтобы вы могли вносить необходимые изменения.