C++ Standard Template Library STL как часть C++ Стандартная библиотека обеспечивает основу для обработки алгоритмов на различных типах контейнеров. Однако обычные массивы не обеспечивают интерфейс STL контейнеров (хотя они обеспечивают итераторный интерфейс STL контейнеров).
В качестве замены для обычных массивов STL предоставляет класс std::vector
. Однако std::vector<>
предоставляет семантику динамических массивов. Таким образом, он управляет данными, чтобы иметь возможность изменить количество элементов. Это приводит к тому, что некоторые накладные расходы в том случае, если необходимы только массивы со статическим размером.
В своей книге Generic Programming и STL Мэтью Х. Austern вводит полезный класс обертывания для обычных массивов со статическим размером, называемый block
. Это безопаснее и не хуже, чем обычные массивы. В The C++ Язык программирования, 3-е издание, Bjarne Stroustrup представляет аналогичный класс, называемый c_array
, который я (Nicolai Josuttis) представил слегка измененный в моей книге С++ Стандартная библиотека - A Tutorial and Reference, называемый carray
. Это суть этих подходов, отмеченных многими отзывами от boost.
Рассмотрев различные названия, мы решили назвать этот класс просто array
.
Обратите внимание, что этот класс предлагается включить в следующий Технический отчет, который расширит стандарт C++ (см. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1548.htm).
Обновление: std::array
является (по состоянию на C++11) частью стандарта C++. Различия между boost::array
и std::array
минимальны. Если вы используете C++11, вы должны рассмотреть возможность использования std::array
вместо boost::array
.
Класс array
выполняет большинство, но не все требования «передаваемых контейнеров» (см. Раздел 23.1, [lib.container.requirements] стандарта C++). Основания массива не являются обратимым контейнером STL, потому что:
- Строителей не предусмотрено.
- Элементы могут иметь неопределенное первоначальное значение (см. секцию под названием “Design Rationale”).
swap
() не имеет постоянной сложности.
размер
() всегда постоянен, исходя из второго аргумента шаблона типа.
- Контейнер не обеспечивает поддержку аллокатора.
Он не удовлетворяет требованиям «последовательности» (см. Раздел 23.1.1, [lib.sequence.reqmts] стандарта C++), за исключением того, что: