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++), за исключением того, что: