Advertisement
kutuzzzov

Урок 6 эффективный список

Dec 26th, 2022
2,005
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <list>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. class Editor {
  9. public:
  10.     Editor() = default;
  11.    
  12.     // сдвинуть курсор влево
  13.     void Left() {
  14.         if (it_ == text_.begin()) {
  15.             return;
  16.         }
  17.         --it_;
  18.     }
  19.    
  20.     // сдвинуть курсор вправо
  21.     void Right() {
  22.         if (it_ == text_.end()) {
  23.             return;
  24.         }
  25.         ++it_;
  26.     }
  27.    
  28.     // вставить символ token
  29.     void Insert(char token) {
  30.         text_.insert(it_, token);
  31.     }
  32.    
  33.     // вырезать не более tokens символов, начиная с текущей позиции курсора
  34.     void Cut(size_t tokens = 1) {
  35.         if (tokens > static_cast<size_t>(distance(it_, text_.end()) )) {
  36.             tokens = static_cast<size_t>(distance(it_, text_.end()) );
  37.         }
  38.         auto nx = std::next(it_, tokens);
  39.         buffer_.assign(it_, nx);
  40.         //text_.erase(it_, nx);
  41.         it_ = text_.erase(it_, nx);
  42.     }
  43.    
  44.     // cкопировать не более tokens символов, начиная с текущей позиции курсора
  45.     void Copy(size_t tokens = 1) {
  46.         if (tokens > static_cast<size_t>(distance(it_, text_.end()) )) {
  47.             tokens = static_cast<size_t>(distance(it_, text_.end()) );
  48.         }
  49.         auto nx = std::next(it_, tokens);
  50.         buffer_.assign(it_, nx);
  51.     }
  52.    
  53.     // вставить содержимое буфера в текущую позицию курсора
  54.     void Paste() {
  55.         text_.insert(it_, buffer_.begin(), buffer_.end());
  56.     }
  57.    
  58.     // получить текущее содержимое текстового редактора
  59.     string GetText() const {
  60.         return {text_.begin(), text_.end()};
  61.     }
  62.  
  63. private:
  64.     list<char> text_{};
  65.     list<char> buffer_{};
  66.     list<char>::iterator it_ = text_.begin();
  67. };
  68.  
  69. int main() {
  70.     Editor editor;
  71.     const string text = "hello, world"s;
  72.     for (char c : text) {
  73.         editor.Insert(c);
  74.     }
  75.     // Текущее состояние редактора: `hello, world|`
  76.     for (size_t i = 0; i < text.size(); ++i) {
  77.         editor.Left();
  78.     }
  79.     // Текущее состояние редактора: `|hello, world`
  80.     editor.Cut(7);
  81.     // Текущее состояние редактора: `|world`
  82.     // в буфере обмена находится текст `hello, `
  83.     for (size_t i = 0; i < 5; ++i) {
  84.         editor.Right();
  85.     }
  86.     // Текущее состояние редактора: `world|`
  87.     editor.Insert(',');
  88.     editor.Insert(' ');
  89.     // Текущее состояние редактора: `world, |`
  90.     editor.Paste();
  91.     // Текущее состояние редактора: `world, hello, |`
  92.     editor.Left();
  93.     editor.Left();
  94.     //Текущее состояние редактора: `world, hello|, `
  95.     editor.Cut(3);  // Будут вырезаны 2 символа
  96.     // Текущее состояние редактора: `world, hello|`
  97.     cout << editor.GetText();
  98.     return 0;
  99. }У
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement