Следуйте STL при определении контейнера
Причина
Контейнеры STL знакомы большинству программистов на C++ и являют собой фундаментально здравый дизайн.
Примечание
Конечно, существуют другие фундаментально здравые стили проектирования и иногда причины отклоняться от стиля стандартной библиотеки, но при отсутствии веской причины отличаться, проще и легче как для реализаторов, так и для пользователей следовать стандарту.
В частности, std::vector и std::map предоставляют полезные относительно простые модели.
Пример
// упрощённый (например, без распределителей):
template<typename T>
class Sorted_vector {
using value_type = T;
// ... типы итераторов ...
Sorted_vector() = default;
Sorted_vector(initializer_list<T>); // конструктор со списком инициализаторов: сортировать и сохранять
Sorted_vector(const Sorted_vector&) = default;
Sorted_vector(Sorted_vector&&) noexcept = default;
Sorted_vector& operator=(const Sorted_vector&) = default; // копирующее присваивание
Sorted_vector& operator=(Sorted_vector&&) noexcept = default; // переместительное присваивание
~Sorted_vector() = default;
Sorted_vector(const std::vector<T>& v); // сохранять и сортировать
Sorted_vector(std::vector<T>&& v); // сортировать и "украсть представление"
const T& operator[](int i) const { return rep[i]; }
// нет неконстантного прямого доступа для сохранения порядка
void push_back(const T&); // вставить в правильное место (не обязательно в конец)
void push_back(T&&); // вставить в правильное место (не обязательно в конец)
// ... cbegin(), cend() ...
private:
std::vector<T> rep; // использовать std::vector для хранения элементов
};
template<typename T> bool operator==(const Sorted_vector<T>&, const Sorted_vector<T>&);
template<typename T> bool operator!=(const Sorted_vector<T>&, const Sorted_vector<T>&);
// ...
Здесь стиль STL соблюдается, но неполностью. Это не редкость. Предоставляйте только столько функциональности, сколько имеет смысл для конкретного контейнера. Ключ состоит в определении обычных конструкторов, присваиваний, деструкторов и итераторов (в той мере, в какой это имеет смысл для конкретного контейнера) с их обычной семантикой. Из этой базы контейнер может быть расширен при необходимости. Здесь были добавлены специальные конструкторы из std::vector.
Применение
???