Вы можете использовать встроенные в C ++ алгоритмы.
Сначала посмотрите пример кода, который может дать вам, и идею о том, как его можно реализовать:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <algorithm>
const std::string fileName{ "test.txt" };
int main() {
// Open the file and check, if it could be opened.
if (std::ifstream inStream(fileName); inStream) {
// Read all words from the file into our vector
std::vector words(std::istream_iterator<std::string>(inStream), {});
std::cout << "\nReversed words:\n\n";
// Show reversed words
std::transform(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "),
[](const std::string& s) { return std::string(s.rbegin(), s.rend()); });
// Sort
std::sort(words.begin(), words.end());
// Show sorted list of words
std::cout << "\n\n\nSorted list of words:\n\n";
std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, " "));
std::cout << "\n\n";
}
else {
std::cerr << "\n*** Error: Could not open file: " << fileName << "\n\n";
}
return 0;
}
Сначала мы откроем файл и проверьте, если открытие прошло успешно. Это мы делаем с , если с оператором init . Таким образом, мы предотвращаем загрязнение внешнего пространства имен. Потоковая переменная просто используется в if
-статменте. И используя часть инициализации if
, мы откроем файл. Часть условия if
-статента - это просто переменная потока. И это будет работать, потому что оператор bool потока ios :: перегружен и вернется, если поток файла в порядке или нет.
OK, теперь файл открыть, и мы хотим прочитать все слова. Итак, мы определяем std::vector
с именем «слова». Нет необходимости определять параметр шаблона для std::vector
. С C ++ 17 CTAD (Вывод аргумента шаблона класса), потому что он будет выведен автоматически.
Мы используем конструктор диапазона std :: vector (здесь число 5) . Итератор begin
- это std :: istream_iterator . Он будет вызывать оператор извлечения >>, пока не будет использован весь ввод. Пожалуйста, обратите внимание. Нам не нужно явно упоминать итератор end
, поскольку {} будет использоваться в качестве инициализатора по умолчанию. Смотрите здесь: конструктор номер 1 .
Итак, определяя переменную и используя ее конструктор диапазона, мы будем читать все слова из файла.
Для обращения вспять словами, мы также будем использовать конструктор диапазона std::sting
. И в качестве итераторов begin
и end
мы используем реверсированные версии. Итак, очень просто.
И чтобы показать перевернутые строки, мы будем использовать std::transform
, go над всеми словами, поместив его в std::ostream_operator
. Это вызовет оператор вставки << для всех слов. А функция преобразования - это лямбда, которая возвращает обратную строку. </p>
Сортировка тривиальна, а копирование отсортированных слов в std::cout
довольно просто.
Все это приводит к элегантности и современности. Код C ++, всего несколько строк.