В чем разница между std :: array и std :: vector? Когда вы используете один над другим?

В чем разница между std::array и std::vector ? Когда вы используете один над другим?

Я всегда использовал std:vector как метод C ++ для использования C-массивов, так в чем же разница?

    std::array – это просто версия classа classического массива C. Это означает, что его размер фиксируется во время компиляции, и он будет выделен как единый fragment (например, занимает место в стеке). Преимущество, которое у него есть, – это немного более высокая производительность, поскольку между объектом и массивными данными нет никакой косвенности.

    std::vector – это небольшой class, содержащий указатели в кучу. (Поэтому, когда вы выделяете std::vector , он всегда вызывает new .) Они немного медленнее для доступа, потому что эти указатели нужно преследовать, чтобы добраться до массированных данных … Но взамен этого они могут быть изменены и они берут только тривиальное количество пространства стека независимо от того, насколько они велики.

    [редактировать]

    Что касается того, когда использовать один над другим, честно std::vector – это почти всегда то, что вы хотите. Создание больших объектов в стеке обычно неодобрительно, и дополнительный уровень косвенности обычно не имеет значения. (Например, если вы перебираете все элементы, дополнительный доступ к памяти происходит только один раз в начале цикла.)

    Элементы вектора гарантированно смежны, поэтому вы можете передать &vec[0] любой функции, ожидающей указателя на массив; например, подпрограммы библиотеки C. (В стороне, std::vector buf(8192); это отличный способ выделить локальный буфер для вызовов read/write или аналогичных без прямого вызова new .)

    Тем не менее, отсутствие этого дополнительного уровня косвенности, а также постоянный размер времени компиляции, могут сделать std::array значительно быстрее для очень маленького массива, который создается / уничтожается / получает доступ к большому количеству.

    Поэтому мой совет: Используйте std::vector если (a) ваш профилировщик не говорит вам, что у вас есть проблема, и (b) массив мал.

    Я собираюсь предположить, что вы знаете, что std :: array время компиляции фиксировано в размере, а std :: vector – переменный размер. Кроме того, я предполагаю, что вы знаете, что std :: array не выполняет динамическое распределение. Поэтому вместо этого я отвечу, почему вы будете использовать std :: array вместо std :: vector.

    Вы когда-нибудь делали это:

     std::vector vecName(10); 

    И тогда вы никогда не увеличиваете размер std :: vector? Если это так, то std :: array – хорошая альтернатива.

    Но действительно, std :: array (в сочетании с списками инициализаторов) существует, чтобы сделать массивы C-стиля почти совершенно бесполезными. Они обычно не конкурируют с std :: векторами; они больше конкурируют с массивами C-стиля.

    Подумайте об этом, поскольку комитет C ++ делает все возможное, чтобы убить почти все законное использование массивов в стиле C.

    std::array

    • является совокупным
    • фиксированный размер
    • требует, чтобы его элементы были по умолчанию конструктивными (vs copy (C ++ 03) или move (C ++ 0x) конструктивным)
    • линейно сменяемо (vs постоянное время)
    • является линейно подвижным (по сравнению с постоянным временем)
    • потенциально платит одну менее косвенную, чем std::vector

    Хороший вариант использования – это делать вещи «близко к металлу», сохраняя тонкости C ++ и сохраняя все плохие вещи из необработанных массивов.

    То же рассуждение при использовании статического массива C-стиля, а не std::vector . И для этого я любезно отсылаю вас сюда .

    std::array имеет фиксированное (время компиляции), в то время как std::vector может расти.

    Таким образом, std::array похож на использование массива C, а std::vector – как динамическое распределение памяти.

    Я использую свой собственный персональный ручной class Array<> , который имеет более простой API по сравнению с std::array или std::vector . Например:

    Чтобы использовать динамический массив:

     Array<> myDynamicArray; // Note array size is not given at compile time myDynamicArray.resize(N); // N is a run time value ... 

    Чтобы использовать статический массив, фиксированный размер во время компиляции:

     Array<100> myFixedArry; 

    Я считаю, что он имеет лучший синтаксис, чем std::array или std::vector . Также чрезвычайно эффективен.

    Одно из преимуществ, которое векторы имеют над массивами, состоит в том, что можно найти текущий размер вектора, используя vector_name.size () .

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

    Interesting Posts

    Причина этого VB6-подобного запаха, который позволяет VB.NET, вместо этого: Ошибка WinFormType.InstanceProp = Значение

    Как получить список загруженных видео для определенного канала с новым API данных YouTube (V3)?

    Недвижимость против ivar во времена ARC

    Как разрешить ошибку установки Windows 10 FIRST_BOOT, MIGRATE_DATA?

    Какие методы «clearfix» можно использовать?

    Как получить несколько значков для запуска различных действий в одном приложении?

    Функция PostgreSQL для последнего вставленного идентификатора

    Запуск java-программы из другой java-программы

    Невозможно выбросить ошибку из функции выполнения асинхронного обещания

    jQuery – В чем разница между $ (document) .ready и $ (window) .load?

    Почему мы должны использовать макеты xml?

    jQuery mobile – для каждого события прямого трансляционного события должно существовать эквивалентное событие click?

    C # управление транзакцией через несколько баз данных

    Отключить звуковое сопровождение звуковой карты Windows

    Почему отсутствует опция «ad hoc network» при создании сетевого подключения в Vista?

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