STL-совместимый контейнер - PullRequest
4 голосов
/ 28 марта 2011

Мне было любопытно, что влечет за собой stl-совместимый контейнер (или буст-совместимый, насколько я понимаю, они либо одинаковые, либо очень похожие). Я видел несколько примеров того, что люди называют stl-совместимым (например, это в codeproject , и, очевидно, фактические контейнеры stl), но я не совсем уверен, какие компоненты этих контейнеров Мне нужно иметь.

Из того, что я мог собрать, мне нужны по крайней мере эти вещи:

  1. STL-совместимые итераторы (текущий stl использует только двунаправленные и более высокие итераторы, не знаю, является ли это требованием или просто случайностью, все еще выясняя, что необходимо считать "stl-" совместимый итератор ")

  2. Механизм определения распределителей (по умолчанию std::allocator), а также их правильного использования (все еще пытаюсь выяснить, что означает эта последняя часть)

  3. публичные определения типа для метапрограммирования (тип указателя, тип указателя const, тип ссылки, тип значения, тип ссылки const, тип различия, может быть, некоторые другие?). Дополнительный вопрос: Что такое difference type?

  4. 'generic' (т. Е. Использует метапрограммирование / шаблоны, чтобы контейнер мог содержать практически любой тип)

Есть ли что-то еще, что я пропустил или, что еще хуже, ошибся в приведенном выше списке (возможно, такие вещи, как const-правильность, безопасность потоков, генерация / обработка исключений и т. Д.)? Кроме того, есть ли где-нибудь документ с описанием спецификаций, детализирующий, что требуется, если такая вещь вообще существует?

1 Ответ

5 голосов
/ 28 марта 2011
  1. Итераторы: стандартная библиотека определяет категории итераторов.Вы хотите предоставить итераторы, которые моделируют одну из этих категорий.В зависимости от вашей точки зрения, istream_iterator и ostream_iterator позволяют потокам быть контейнерами, которые не предоставляют двунаправленных итераторов.

  2. В основном, вы используете распределитель allocate(n) для выделения пространствадля n объектов и deallocate(p, n) для освобождения места для n объектов, на которые указывает p.Вы обычно не используете члены construct или destroy распределителя.

  3. Да, есть несколько других (например, ассоциативные контейнеры определяют key_type).difference_type - это тип, который может представлять разницу между двумя указателями.Обычно он предоставляется распределителем, поэтому у контейнера просто будет typedef, например:

    typedef Allocator :: diff_type diff_type;

  4. Это не обязательно (или даже обычно)любое задействованное метапрограммирование, просто (довольно простое) общее программирование.Т.е. вы определяете шаблон, но не обязательно выполняете какие-либо вычисления во время компиляции (что будет метапрограммированием).

Текущий стандарт неопределить что-нибудь о безопасности потоков.Конечной ссылкой на то, что требуется, является сам стандарт C ++.Вы можете бесплатно загрузить текущую версию готовящегося стандарта C ++ 0x ( N3242 ).Требования к контейнерам приведены в разделе 23.2.Возможно, вы также захотите взглянуть на стандартную библиотеку Josuttis C ++ - это немного более мягкое чтение, чем сам стандарт.

Обновление: конечно, C ++ 11 (только немного позжеизначально был написан) добавлены потоки и некоторые определения безопасности потоков, гонок данных и так далее.Это примерно указывает на то, что большинство людей уже сделали: параллельное чтение разрешено, но запись должна быть эксклюзивной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...