Есть ли правила написания нового контейнера, который будет вести себя как любой другой STL
контейнер?
c++
stl
c++-standard-library
Авинаш
источник
источник
Ответы:
Вот последовательность псевдо-контейнер я кусочкам из § 23.2.1 \ 4 Обратите внимание , что
iterator_category
должен быть один изstd::input_iterator_tag
,std::output_iterator_tag
,std::forward_iterator_tag
,std::bidirectional_iterator_tag
,std::random_access_iterator_tag
. Также обратите внимание, что приведенное ниже технически более строгое, чем требуется, но это идея. Обратите внимание, что подавляющее большинство «стандартных» функций технически необязательны из-за того, что итераторы хороши.Кроме того, всякий раз, когда я создаю контейнер, я тестирую его примерно с таким классом:
Создавайте контейнеры из
tester
объектов и вызывайте каждый из нихfunction()
при тестировании контейнера. Не создавайте никаких глобальныхtester
объектов. Если ваш контейнер где-то читерствует, этотtester
класс будетassert
и вы узнаете, что где-то случайно обманули.источник
assert(tester::livecount == 0);
. Ммммм, до сих пор не знаю, как работает этот тестер. Не могли бы вы привести пример?memcpy
произошло ли недействительного . (тест не является надежным, но он улавливает некоторых). Этоlivecount
простой детектор утечек, позволяющий убедиться, что ваш контейнер вызвал равное количество конструкторов и деструкторов.verifier
не имели в видуvarifier
.std::iterator
заголовка<iterator>
Вам нужно будет прочитать раздел стандарта C ++ о контейнерах и требованиях, которые стандарт C ++ предъявляет к реализациям контейнеров.
Соответствующая глава в стандарте C ++ 03:
Раздел 23.1 Требования к контейнерам
Соответствующая глава в стандарте C ++ 11:
Раздел 23.2 Требования к контейнерам
Почти окончательный вариант стандарта C ++ 11 находится в свободном доступе здесь. .
Вы также можете прочитать несколько отличных книг, которые помогут вам понять требования с точки зрения пользователя контейнера. Две прекрасные книги, которые легко поразили меня:
Эффективное STL отScott Meyers &
The ++ Стандартной библиотеки C: учебник и справочник поNicolai Josutils
источник
Вот очень упрощенная реализация поддельного вектора, который по сути представляет собой оболочку
std::vector
и имеет собственный (но настоящий) итератор, имитирующий итератор STL. Опять же, итератор очень упрощен, он пропускает многие концепции, такие какconst_iterator
проверки действительности и т. Д.Код запускается из коробки.
источник