Advertisement
chevengur

СПРИНТ № 8 | Эффективные линейные контейнеры | Урок 6: Эффективный список

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