Да, знакомство с коллекциями необходимо каждому программисту.

Вроде бы все просто, но когда я разговаривал со своими коллегами, я не видел, чтобы они разбирались в этой теме.

Большинство разработчиков сосредотачиваются на выполнении задачи и склонны пренебрегать свойствами кода. Что ж, мир разработки программного обеспечения предлагает более трех основных контейнеров: динамические массивы, списки и векторы.

Продвинутые разработчики знают карты и наборы. Это полезный список коллекций, но я думаю, что знаний о них недостаточно. Особенно, когда вы должны реализовать эффективный код. Например, графический рендеринг или операционная система реального времени. Тогда вы должны знать все об их свойствах. Я предпочитаю рассматривать даже самые простые контейнеры как интересные объекты — можно многому научиться, анализируя их и варианты их использования.

Поэтому я хочу представить несколько примеров коллекций, чтобы вам было удобно с ними знакомиться. Первый пример, который я хотел бы представить, — это создание массива постоянного размера.

Посмотрите на это: std::array показывает мощность, когда мы пытаемся установить индекс вне допустимого диапазона. Когда мы использовали стандартные скобки, то значение за пределами диапазона является мусором, и программа во время операции не знает об этом. Но когда мы используем метод «at» массива std::array для получения значения, программа выдает исключение «std::out_of_range».

Старая программистская поговорка гласит: «Лучше, когда программа выдает исключение, чем когда она показывает вам какое-то случайное значение, появившееся ни с того ни с сего».

Если вы получаете исключение, вы можете найти корень проблемы.

Откровенно говоря, это не всегда возможно. Во-первых, метод at слишком медленный в приложениях реального времени, поэтому его следует использовать только в теоретических примерах, но если вы действительно хотите улучшить свое приложение, избегайте его. Пример показывает забавную вещь, что std::array действительно выделил только 10 элементов, в то время как обычный массив выделил 40 элементов. Конечно, вы всегда должны помнить, что все контейнеры STL имеют итератор, который является лучшим инструментом в C++, открытым для всех других библиотек в STL. В этом случае рассмотрите возможность использования std::array.

Ну, я дал вам второй пример с динамическим массивом. В этом случае новый стандарт C++ рекомендует использовать векторный контейнер. Вывод этой программы такой же.

Есть небольшая проблема, связанная с этим новым способом программирования. Производительность лучше, когда вы используете массив старого стиля, чем вектор. Итак, чтобы улучшить низкую производительность, я дам вам несколько приемов по оптимизации вектора.
1. Перераспределенная память может стать серьезной проблемой, особенно для вектора. Хорошее решение — зарезервировать больше памяти, чем вам нужно в начале. Используйте, например: vec.reserve(n*8);

2. Если вы хотите скопировать элементы из одной коллекции в другую, используйте «=» для присвоения значения. Самый медленный способ — использовать цикл и функцию push_back(). Достаточно быстро вставка работает. Но лучше всего использовать:
newVec = oldVec;

3. Когда вы хотите просмотреть коллекцию, используйте итератор. Метод at() безопаснее, но слишком медленный.

4. Старайтесь не вставлять элемент в начало вектора.

5. Используйте shrint_to_fit после назначенных значений, чтобы свести к минимуму ненужные переходы через неиспользуемые сегменты памяти.

Мой совет - выбирать контейнеры STL, когда вы позволяете создавать программное обеспечение с другими библиотеками с некоторой ценой скорости приложения. Эта ситуация открывает мир с помощью итератора, замечательных методов (например, своп, изменение размера, резервирование, размещение, сжатие_в_подгонку) и четких сообщений об исключениях. В другом случае, когда вы хотите сосредоточиться на производительности, используйте динамический массив. Полезной привычкой в ​​разработке игр является создание собственного класса с некоторыми базовыми методами, использующими динамический массив, но с некоторыми «новыми функциями», такими как итератор и полезные методы.