Menulis Bekas Mematuhi STL yang Cekap
Mencipta bekas tersuai mengikut garis panduan STL (Perpustakaan Templat Standard) memastikan penyepaduan yang lancar dengan STL ekosistem dan menjamin tingkah laku yang boleh diramal dan konsisten. Walaupun garis panduan tidak ditakrifkan secara eksplisit, mematuhi konvensyen bekas STL sedia ada boleh membimbing reka bentuk anda.
Templat berikut ialah bekas pseudo sampel yang menunjukkan ciri teras bekas STL:
template <class T, class A = std::allocator<T>> class X { // Required Declarations: typedef A allocator_type; typedef typename A::value_type value_type; typedef typename A::reference reference; typedef typename A::iterator iterator; typedef typename A::const_iterator const_iterator; // Required Iterators: class iterator { // Required Iterator Declarations and Operators: iterator(); iterator(const iterator&); ~iterator(); iterator& operator=(const iterator&); // Comparison Operators: bool operator==(const iterator&) const; bool operator!=(const iterator&) const; bool operator<(const iterator&) const; // Optional // Pointer Arithmetic Operators: iterator& operator++(); iterator operator++(int); // Optional iterator& operator--(); // Optional iterator operator--(int); // Optional iterator& operator+=(size_type); // Optional iterator operator+(size_type) const; // Optional iterator& operator-=(size_type); // Optional iterator operator-(size_type) const; // Optional // Dereference Operators: reference operator*() const; pointer operator->() const; }; class const_iterator { // Required Const Iterator Declarations and Operators: const_iterator(); const_iterator(const const_iterator&); const_iterator(const iterator&); ~const_iterator(); const_iterator& operator=(const const_iterator&); // Comparison Operators: bool operator==(const const_iterator&) const; bool operator!=(const const_iterator&) const; bool operator<(const const_iterator&) const; // Optional // Pointer Arithmetic Operators: const_iterator& operator++(); const_iterator operator++(int); // Optional const_iterator& operator--(); // Optional const_iterator operator--(int); // Optional const_iterator& operator+=(size_type); // Optional const_iterator operator+(size_type) const; // Optional const_iterator& operator-=(size_type); // Optional const_iterator operator-(size_type) const; // Optional // Dereference Operators: reference operator*() const; pointer operator->() const; }; // Optional Reverse Iterators: typedef std::reverse_iterator<iterator> reverse_iterator; typedef std::reverse_iterator<const_iterator> const_reverse_iterator; // Required Member Functions: X(); X(const X&); ~X(); X& operator=(const X&); iterator begin(); const_iterator begin() const; const_iterator cbegin() const; iterator end(); const_iterator end() const; const_iterator cend() const; };
Untuk memastikan integriti bekas anda, pertimbangkan untuk menggunakan kelas ujian seperti:
struct tester { friend verify; static int livecount; tester() { ++livecount; } tester(const tester&) { ++livecount; } ~tester() { assert(livecount); --livecount; } };
Dengan menguji bekas anda dengan objek penguji, anda boleh mengesahkan bahawa ia mematuhi garis panduan dan berkelakuan seperti yang diharapkan.
Atas ialah kandungan terperinci Bagaimana untuk Mencipta Bekas Tersuai Mematuhi STL dengan Cekap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!