Writing Efficient STL-Compliant Containers
Creating custom containers in accordance with the STL (Standard Template Library) guidelines ensures seamless integration with the STL ecosystem and guarantees predictable and consistent behavior. While the guidelines are not explicitly defined, adhering to the conventions of existing STL containers can guide your design.
The following template is a sample pseudo-container that demonstrates the core characteristics of an STL container:
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; };
To ensure the integrity of your containers, consider using a testing class like:
struct tester { friend verify; static int livecount; tester() { ++livecount; } tester(const tester&) { ++livecount; } ~tester() { assert(livecount); --livecount; } };
By testing your container with tester objects, you can verify that it follows the guidelines and behaves as expected.
The above is the detailed content of How to Efficiently Create STL-Compliant Custom Containers?. For more information, please follow other related articles on the PHP Chinese website!