Advertisement
gluk47

seminar 2023-02-10

Feb 10th, 2023 (edited)
816
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.86 KB | None | 0 0
  1. // https://leetcode.com/problems/permutation-in-string/
  2. bool contains_unordered (const string& text, const string& letters) {
  3.     // text=hello, letters=ehl → true
  4.     // text=hello, letters=helo → false
  5.     // text=hello_world, letters=ehlol → true
  6.     if (text.size() < letters.size())
  7.         return false;
  8.  
  9.     std::unordered_map<char, int> needed_symbols;
  10.     std::unordered_map<char, int> symbols_in_text;
  11.  
  12.     // text: abaa, letters = aa
  13.  
  14.     for (auto& symbol : letters) {
  15.         ++needed_symbols[symbol];
  16.     }
  17.     size_t cnt = 0;
  18.  
  19.     auto add = [&](char c, int d) {
  20.         if (symbols_in_text[c] == needed_symbols[c]) {
  21.             --cnt;
  22.         }
  23.         symbols_in_text[c] += d;
  24.         if (symbols_in_text[c] == needed_symbols[c]) {
  25.             ++cnt;
  26.         }
  27.     };
  28.      
  29.    
  30.     for (std::size_t i = 0; i < letters.size(); ++i) {
  31.         add(text[i], +1);
  32.     }
  33.  
  34.     for (std::size_t i = letters.size(); i < text.size(); ++i) {
  35.         if (cnt == needed_symbols.size()) {
  36.           return true;
  37.         }
  38.      
  39.         add(text[i - letters.size()], -1);
  40.         add(text[i], +1)    
  41.     }
  42.     return cnt == needed_symbols.size();
  43. }
  44.  
  45. // --------------
  46.  
  47. // RAII-указатель
  48. template <class T>
  49. class unique_ptr {
  50. public:
  51.     unique_ptr() = default;
  52.     unique_ptr(T* ptr)
  53.     : data(ptr) {}
  54.     unique_ptr(unique_ptr<T>&& other)
  55.     : data(other.data) {
  56.         other.data = nullptr;
  57.     }
  58.  
  59.     unique_ptr<T>& operator=(unique_ptr<T>&& other) {
  60.         reset(other.release());
  61.     }
  62.  
  63.     ~unique_ptr() { delete data; }
  64.     T* get() & { return data; }
  65.     const T* get() const& { return data; }
  66.  
  67.     void reset(T* ptr = nullptr) {
  68.         delete data;
  69.         data = ptr;
  70.     }
  71.  
  72.     T* release() {
  73.         T* ptr = data;
  74.         data = nullptr;
  75.         return ptr;
  76.     }
  77.  
  78.     T* operator->() { return data; }
  79.     T& operator*() { return *data; }
  80.     const T& operator*() const { return *data; }
  81.  
  82. private:
  83.     T* data = nullptr;
  84. };
  85.  
  86. {
  87.     unique_ptr<string> p(new string{"hello"});
  88.     unique_ptr<string> q = std::move(p);
  89. }
  90.  
  91. // ----------------
  92.  
  93. > want speed? pass by value  (Scott Meyers)
  94. //  --------------
  95.  
  96. class Student {
  97. public:
  98. /*
  99.     Student(const string& name)
  100.     : name(name)
  101.     {}
  102.  
  103.     Student(string&& name)
  104.     : name(std::move(name))
  105.     {}
  106. */
  107.     // copy elision для временного объекта
  108.     Student(string name)
  109.     : name(std::move(name))
  110.     {}
  111.  
  112.     const string& name() const& {
  113.         return name;
  114.     }
  115.  
  116.     string name() && {
  117.         return name;
  118.     }
  119.  
  120. private:
  121.     string name;
  122. };
  123.  
  124. string GetStudentName() {
  125.     return "John Snow";
  126. }
  127.  
  128. Student GetStudent() {
  129.     return Student {"John Snow"};
  130. }
  131.  
  132. int main() {
  133.     Student s(GetStudentName());
  134.  
  135.     for (const char c : GetStudent()) {
  136.         cout << c << "\n";
  137.     }
  138. }
  139. //  ---------------
  140.  
  141. class Vector {
  142. public:
  143.     Vector() = default;
  144.     Vector(const Vector& rhs)
  145.     : size_(rhs.size_)
  146.     , data_(new int[size_])
  147.     {
  148.         std::copy(rhs.data_, rhs.data_ + size_, data_);
  149.     }
  150.  
  151.     // move constructor
  152.     Vector(Vector&& rhs)
  153.     : size_(rhs.size_)
  154.     , data_(rhs.data_)
  155.     {
  156.         size_ = 0;
  157.         rhs.data_ = nullptr;
  158.         // std::move(rhs)  —  static_cast<Vector&&>(rhs)
  159.     }
  160.  
  161.     explicit Vector(size_t sz)
  162.     : size_(sz)
  163.     , data_(new int[sz])
  164.     {}
  165.  
  166.     ~Vector() {
  167.         delete[] data_;
  168.     }
  169.  
  170.     int& at(size_t i) & {
  171.         return data_[i];
  172.     }
  173.     const int& at(size_t i) const& {
  174.         return data_[i];
  175.     }
  176.  
  177.     int at(size_t i) && {
  178.         return data_[i];
  179.     }
  180.  
  181. private:
  182.     size_t size_;
  183.     int* data_;
  184. };
  185.  
  186.  
  187. Vector generate_odd(int l, int r) {
  188.     Vector odds((r - l + 1) / 2);
  189.     return odds;  // copy elision, rvo (return value optimization)
  190. }
  191.  
  192. int main() {
  193.     Vector v = generate_odd(10, 20);
  194.     Vector nums = std::move(v);
  195.     cout << nums;
  196. }
  197.  
  198.  
  199. std::move
  200. rvalue refs
  201. //  --------------------------------
  202.  
  203. // cout, cerr — глобальные переменные
  204.  
  205. class Singleton {
  206. public:
  207.     static Singleton& GetInstance() {
  208.         static Singleton instance;
  209.         return instance;
  210.     }
  211.  
  212. private:
  213.     Singleton() = default;
  214.     Singleton(const Singleton&) = delete;
  215.  
  216.     TMySqlDatabase db;
  217. };
  218.  
  219. int main() {
  220.     auto& s = Singleton::GetInstance();
  221. }
  222.  
  223. //  ------------------------------
  224.  
  225. class Logger {
  226. public:
  227.     static std::ostream& debug() {
  228.         // this — не передаётся
  229.         static ofstream devnull{"/dev/null"};
  230.         return DebugOutput ? cerr : devnull;
  231.     }
  232.  
  233.     static bool DebugOutput;
  234. };
  235.  
  236. static bool Logger::DebugOutput = false;
  237.  
  238. int main() {
  239.     Logger::DebugOutput = true;
  240.     auto& dbg = Logger::debug();
  241.     dbg << "3 + 2 = " << (3 + 2) << "\n";
  242.  
  243.     Logger* l = nullptr;
  244.     // UB, если l не указывает на реальный объект
  245.     l->debug() << "hello\n";  
  246.  
  247.     // l->f()  — то же самое, что — (*l).f()
  248.     // *l; — не UB
  249. }
  250.  
  251. // -----------------
  252.  
  253. int main() {
  254.     string s;  //< до }
  255.  
  256.     size_t count;
  257.     cin >> count;
  258.     string* strings = new string[count];
  259.     // new: вызывает конструктор string()
  260.     delete[] strings;  // вызывает деструкторы у каждого объекта
  261. }
  262.  
  263. // ------------------
  264.  
  265. struct Logger1 {
  266.     Logger1(const string& name)
  267.     : name(name) {
  268.         cout << "Logger1(" << name << ")\n";
  269.     }
  270.  
  271.     ~Logger1() {
  272.         cout << "~Logger1(" << name << ")\n";
  273.     }
  274.  
  275.     string name;
  276. };
  277.  
  278. struct Logger2 {
  279.     Logger2(const string& name)
  280.     : name(name) {
  281.         cout << "Logger2(" << name << ")\n";
  282.     }
  283.  
  284.     ~Logger2() {
  285.         cout << "~Logger2(" << name << ")\n";
  286.     }
  287.  
  288.     Logger1 a{"a"};
  289.     Logger1 b{"b"};
  290.     string name;
  291. };
  292.  
  293. int main() {
  294.     Logger2 obj{"outer"};
  295.     // logger1(a), logger1(b), logger2(outer)
  296.     // ~logger2(outer), ~logger1(b), ~logger1(a)
  297. }
  298.  
  299.  
  300. //   --------------
  301.  
  302. struct Student {
  303.     string name_;
  304.     string surname_;
  305. }
  306.  
  307. int main() {
  308.     Student s;
  309.     // s.name_.string()
  310.     // s.surname_.string()
  311.     // s.Student()
  312. }
  313.  
  314. // RAII - resource acquisition is initialisation
  315. class Vector {
  316. public:
  317.     Vector() = default;
  318.     Vector(const Vector& rhs)
  319.     : size_(rhs.size_)
  320.     , data_(new int[size_])
  321.     {
  322.         std::copy(rhs.data_, rhs.data_ + size_, data_);
  323.     }
  324.     // Vector(const Vector&) = delete;
  325.  
  326.     explicit Vector(size_t sz)
  327.     : size_(sz)
  328.     , data_(new int[sz])
  329.     {} // open(...)
  330.  
  331.     ~Vector() {
  332.         delete[] data_;
  333.         // close(...)
  334.     }
  335.  
  336. private:
  337.     Vector(int*) {...}
  338.  
  339.     size_t size_;
  340.     int* data_ = nullptr;
  341. };
  342.  
  343. void Print(const Vector& v) {
  344.     // cout <<
  345. }
  346.  
  347. int main() {
  348.     Vector v(10);
  349.  
  350.     Vector v2 = v;  //< copy constructor
  351.     // v2 = v;  // < operator =
  352.  
  353.     Print(10); //< Print(Vector(10));  (без explicit)
  354. }
  355.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement