Преимущества использования массивов вместо std :: vector? - PullRequest
9 голосов
/ 23 октября 2010

В настоящее время я вижу много вопросов с тегами C ++, касающихся обработки массивов.
Есть даже вопросы, которые задают о методах / функциях для массивов, которые std::vector предоставил бы без всякой магии.

Поэтому мне интересно, почему так много разработчиков выбирают массивы вместо std::vector в C ++?

Ответы [ 5 ]

9 голосов
/ 23 октября 2010

В общем, я настоятельно предпочитаю использовать вектор над массивом для нетривиальной работы; Тем не менее, есть некоторые преимущества массивов.

  • массивы немного более компактны: размер неявен
  • массивы не могут быть изменены; иногда это желательно
  • массивы не требуют разбора дополнительных заголовков STL (время компиляции)
  • может быть проще взаимодействовать с прямым кодом C с массивом (например, если C выделяет, а C ++ использует)
  • Массивы фиксированного размера могут быть встроены непосредственно в структуру или объект, что может улучшить локальность памяти и сократить необходимое количество выделенных куч
4 голосов
/ 23 октября 2010

Потому что C ++ 03 не имеет векторных литералов. Использование массивов может иногда давать более сжатый код.

По сравнению с инициализацией массива:

char arr[4] = {'A', 'B', 'C', 'D'};

инициализация вектора может выглядеть несколько многословно

std::vector<char> v;
v.push_back('A');
v.push_back('B');
...
2 голосов
/ 23 октября 2010

Я бы выбрал std :: array, доступный в C ++ 0x, вместо простых массивов, которые также можно инициализировать как стандартные массивы со списком инициализаторов

https://en.cppreference.com/w/cpp/container/array

1 голос
/ 23 января 2013

У вас гораздо больше контроля над массивами

Как насчет:

1) вы имеете дело с колоссальными наборами данных, где данные должны быть сопоставлены с файлами, а не выделены с помощью malloc илиnew из-за его размера.При таком сценарии беспокойство о том, что делать, если вы не зарезервировали достаточно адресного пространства в начале, может быть спорным, хотя я полагаю, что вы можете удалить, расширить, переназначить файл, если это не запрещено фрагментацией адреса или моей второй точкой.

2) Код, который использует многопроцессорную обработку без блокировки.Хиты производительности при остановке потоков для перераспределения (или любой другой «вкусности STL») могут быть неприемлемыми, поэтому при использовании массивов у вас гораздо больше контроля, вам может потребоваться вызвать множество функций, чтобы приостановить другие потоки перед изменением размерачто-нибудь.

Кстати, я обычно имею дело с 1 и 2 одновременно.Массивы структур + указатели прекрасно работают, компилируя с C ++, потому что вы все еще можете использовать некоторые функции C ++ в других местах кода.Я уверен, что мог бы придумать еще много примеров, если бы попытался достаточно усердно

1 голос
/ 23 октября 2010

Я думаю, это потому, что многие программисты на C ++ пришли из C и еще не понимают преимуществ использования vector и всех дополнительных вкусностей STL, которые бесплатно предоставляются с его контейнерами.

...