Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- using namespace std;
- class String {
- char* str; // Строка (динамически выделенная память)
- int len; // Длина строки
- public:
- // Конструктор по умолчанию
- String(const char* s = "") {
- len = strlen(s);
- str = new char[len + 1];
- strcpy(str, s);
- }
- // Конструктор копирования
- String(const String& other) {
- len = other.len;
- str = new char[len + 1];
- strcpy(str, other.str);
- }
- // Оператор присваивания
- String& operator=(const String& other) {
- if (this != &other) {
- delete[] str;
- len = other.len;
- str = new char[len + 1];
- strcpy(str, other.str);
- }
- return *this;
- }
- // Деструктор
- ~String() {
- delete[] str;
- }
- // Метод для получения длины строки
- int length() const {
- return len;
- }
- // Метод substring для получения подстроки
- String substring(int start, int end) const {
- char* buffer = new char[end - start + 1];
- for (int i = start; i < end; ++i) {
- buffer[i - start] = str[i];
- }
- buffer[end - start] = '\0';
- return String(buffer);
- }
- // Метод contains для проверки наличия символа в строке
- bool contains(char ch, const String& delimeters) const {
- for (int i = 0; i < delimeters.len; ++i) {
- if (delimeters.str[i] == ch) {
- return true;
- }
- }
- return false;
- }
- // Метод split для разделения строки по разделителям
- class WordIterator split(const String& delimeters = " \t\n") const;
- // Оператор вывода
- friend ostream& operator<<(ostream& os, const String& s) {
- os << s.str;
- return os;
- }
- };
- // Структура для хранения слова и указателя на следующий элемент
- struct ListItem {
- String word; // Слово
- ListItem* next; // Указатель на следующий элемент списка
- ListItem(const String& w, ListItem* n = nullptr) : word(w), next(n) {}
- };
- // Класс WordIterator для итерации по списку слов
- class WordIterator {
- ListItem* head; // Указатель на первый элемент списка
- ListItem* current; // Указатель на текущее слово
- int count; // Общее количество слов
- public:
- // Конструктор
- WordIterator(ListItem* h) : head(h), current(h), count(0) {
- // Подсчитываем количество элементов
- ListItem* temp = h;
- while (temp) {
- count++;
- temp = temp->next;
- }
- }
- // Возвращает текущее слово
- const String& current_word() const {
- return current->word;
- }
- // Переход к следующему слову
- bool next() {
- if (current && current->next) {
- current = current->next;
- return true;
- }
- return false;
- }
- // Перемещает итератор на первое слово
- void begin() {
- current = head;
- }
- // Возвращает количество слов
- int get_count() const {
- return count;
- }
- // Деструктор для удаления динамического списка
- ~WordIterator() {
- while (head) {
- ListItem* temp = head;
- head = head->next;
- delete temp;
- }
- }
- };
- // Реализация метода split
- WordIterator String::split(const String& delimeters) const {
- ListItem* head = nullptr;
- ListItem* tail = nullptr;
- int start = 0;
- for (int i = 0; i <= len; ++i) {
- // Если найден разделитель или достигнут конец строки
- if (i == len || contains(str[i], delimeters)) {
- if (i > start) {
- // Получаем слово между start и i
- String word = substring(start, i);
- // Создаём новый элемент списка
- ListItem* newItem = new ListItem(word);
- if (!head) {
- head = newItem;
- } else {
- tail->next = newItem;
- }
- tail = newItem;
- }
- start = i + 1; // Переходим к следующему слову
- }
- }
- return WordIterator(head); // Возвращаем итератор по списку слов
- }
- int main() {
- String s = "Hello \tworld 2024!\n\n";
- // Разделяем строку
- WordIterator it = s.split();
- // Выводим слова
- do {
- cout << it.current_word() << endl;
- } while (it.next());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement