Массивы против векторов: вводные сходства и различия

Каковы различия между массивом и вектором в C ++? Примером различий могут быть включены библиотеки, символизм, способности и т. Д.

массив

Массивы содержат определенное количество элементов определенного типа. Чтобы компилятор мог зарезервировать требуемое пространство при компиляции программы, вы должны указать тип и количество элементов, которые будет содержать массив, когда он будет определен. Компилятор должен иметь возможность определить это значение при компиляции программы. Как только массив определен, вы используете идентификатор для массива вместе с индексом для доступа к определенным элементам массива. […] массивы нуль-индексируются; то есть первый элемент находится в индексе 0. Эта схема индексирования указывает на тесную связь в C ++ между указателями и массивами и правилами, которые язык определяет для арифметики указателя.

– C ++ Pocket Reference

Вектор

Вектор представляет собой последовательность объектов с динамическим размером, которая обеспечивает случайный доступ к operator[] . Функция-член push_back копирует свои аргументы через конструктор копирования, добавляет эту копию как последний элемент в вектор и увеличивает его размер на единицу. pop_back делает все наоборот, удаляя последний элемент. Вставка или удаление элементов с конца вектора берет амортизированное постоянное время, а вставка или удаление из любого другого места занимает линейное время. Это основы векторов. Их гораздо больше. В большинстве случаев вектор должен быть вашим первым выбором в массиве C-стиля. Прежде всего, они имеют динамический размер, что означает, что они могут расти по мере необходимости. Вам не нужно делать всевозможные исследования, чтобы определить оптимальный статический размер, как в случае с массивами C; вектор растет по мере необходимости, и он может быть изменен более или менее вручную, если вам нужно. Во-вторых, векторы предлагают проверку границ с помощью функции-члена (но не с operator[] ), так что вы можете что-то сделать, если ссылаетесь на несуществующий индекс, а не просто наблюдаете за сбоем в программе или хуже, продолжая выполнение с поврежденными данными.

– C ++ Cookbook

    3 Solutions collect form web for “Массивы против векторов: вводные сходства и различия”

    массивы:

    • – встроенная языковая конструкция;
    • почти не изменен с C89;
    • обеспечивают только последовательную, индексируемую последовательность элементов ; нет колоколов и свистов;
    • имеют фиксированный размер; вы не можете изменять размер массива в C ++ (если только он не является массивом POD и выделяется с помощью malloc );
    • их размер должен быть константой времени компиляции, если они не распределены динамически;
    • они берут свое пространство для хранения в зависимости от области, в которой вы их заявляете;
    • если они динамически распределены, вы должны явно освободить их;
    • если они динамически распределены, вы просто получаете указатель, и вы не можете определить их размер; в противном случае вы можете использовать sizeof (следовательно, общий sizeof(arr)/sizeof(*arr) идиомы sizeof(arr)/sizeof(*arr) , который, однако, терпит неудачу при непреднамеренном использовании указателя);
    • автоматически распадаются на указатели в большинстве ситуаций; в частности, это происходит при передаче их функции, которая обычно требует передачи отдельного параметра для их размера;
    • не может быть возвращено из функции;
    • не могут быть скопированы / назначены напрямую;
    • динамические массивы объектов требуют конструктора по умолчанию, поскольку сначала должны быть построены все их элементы;

    std::vector :

    • class шаблона;
    • является только конструкцией C ++;
    • реализуется как динамический массив ;
    • растет и сжимается динамически;
    • автоматически управлять своей памятью, которая освобождается от уничтожения;
    • могут быть переданы / возвращены из функций (по значению);
    • может быть скопирован / назначен (это выполняет глубокую копию всех сохраненных элементов);
    • не распадается на указатели, но вы можете явно получить указатель на свои данные ( &vec[0] гарантированно работает как ожидалось);
    • всегда приносит вместе с внутренним динамическим массивом его размер (количество элементов в настоящее время хранится) и емкость (сколько элементов может быть сохранено в текущем выделенном блоке);
    • внутренний динамический массив не выделяется внутри самого объекта (который содержит только несколько полей «бухгалтерии»), но динамически выделяется распределителем, указанным в соответствующем параметре шаблона; по умолчанию получает память из freestore (так называемая куча) независимо от того, как распределяется фактический объект;
    • по этой причине они могут быть менее эффективными, чем «обычные» массивы для небольших, недолговечных локальных массивов;
    • при перераспределении объекты копируются (перемещаются, на C ++ 11);
    • не требует конструктора по умолчанию для хранящихся объектов;
    • лучше интегрируется с остальной частью так называемого STL (он предоставляет методы begin() / end() , обычные STL typedef s, …)

    Также рассмотрим «современную альтернативу» массивам – std::array ; Я уже описал в другом ответе разницу между std::vector и std::array , вы можете взглянуть на него.

    Я добавлю, что массивы – это очень низкоуровневые конструкции на C ++, и вы должны стараться держаться подальше от них как можно больше, когда «изучаете веревки» – даже это рекомендует Bjarne Stroustrup (он дизайнер C ++).

    Векторы очень близки к той же производительности, что и массивы, но с множеством удобств и функций безопасности. Возможно, вы начнете использовать массивы при взаимодействии с API, которые работают с необработанными массивами или при создании собственных коллекций.

    Эта рекомендация в значительной степени ответила на ваш вопрос. Проще говоря, длины векторов являются динамическими, а массивы имеют фиксированный размер. при использовании массива вы определяете его размер при объявлении:

     int myArray[100]; myArray[0]=1; myArray[1]=2; myArray[2]=3; 

    для векторов вы просто объявляете это и добавляете элементы

     vector myVector; myVector.push_back(1); myVector.push_back(2); myVector.push_back(3); ... 

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

    Interesting Posts

    Полноэкранный Emacs в OSX

    Советы по оптимизации программ C # /. NET

    Невозможно избавиться от высокопроизводительного процессора Win 10 'и сжатой памяти', любого предложения?

    Как «разогревать» Entity Framework? Когда он становится «холодным»?

    Простой способ повторить строку в java

    Как заставить Visual Studio восстанавливать файлы .designer для файлов aspx / ascx?

    Используйте интернет-компьютер на мобильном телефоне через Bluetooth

    Как отправить записи журнала на удаленный сервер, на котором запущен journald (systemd)

    Установите IE10 в режим IE9 для определенных сайтов

    Exception ‘open failed: EACCES (Permission denied)’ на Android

    ПК не может видеть сервер Clonezilla при использовании PXE Boot

    java.awt.EventQueue.invokeLater объяснен

    Может ли какое-то программное обеспечение физически повредить аппаратное обеспечение?

    Инъекция зависимостей и шаблон Singleton Design

    Как удалить все не буквенно-цифровые символы из строки, кроме тире?

    Давайте будем гением компьютера.