Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Bekas Tersuai Mematuhi STL dengan Cekap?

Bagaimana untuk Mencipta Bekas Tersuai Mematuhi STL dengan Cekap?

Susan Sarandon
Lepaskan: 2024-12-04 06:18:12
asal
180 orang telah melayarinya

How to Efficiently Create STL-Compliant Custom Containers?

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;
};
Salin selepas log masuk

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; }
};
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan