Должны ли массивы использоваться в C ++?

Посколькуstd::list а такжеstd::vector Существуют, есть ли причина использовать традиционные массивы C в C ++, или их следует избегать, какmalloc?

Ответы на вопрос(11)

std::array доступен, ответ "да, массивов следует избегать". До C ++ 11 вам может понадобиться использовать массивы C для выделения массивов в автоматическом хранилище (т.е. в стеке).

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

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

е @ нет, Я не могу придумать причину для использования сырых массивов, скажем,vectors. Если код новый.

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

что массивы все еще полезны, если вы храните небольшой статический объем данных, почему бы и нет.

но вы не должны передавать указатели на такие контейнеры между различными модулями, иначе вы попадете в ад зависимостей. Пример

std::string foo;
//  fill foo with stuff
myExternalOutputProc(foo.c_str());

это очень хорошее решение, но не

std::string foo;
//  fill foo with stuff
myExternalOutputProc(&foo);

Причина в том, что std :: string может быть реализован многими различными способами, но строка в стиле c всегда является строкой в стиле c.

заключенного во что-то, что будет автоматически управлять его освобождением при необходимости) передstd::vector Я могу думать о том, чтоvector не может передать права собственности на свои данные, если ваш компилятор не поддерживает C ++ 11 и конструкторы перемещения.

но я бы согласился, что их роль значительно уменьшается из-за истинных структур данных из STL.

Я бы также сказал, что инкапсуляция внутри объектов должна минимизировать влияние таких выборов. Если массив является частным членом данных, вы можете поменять его местами, не затрагивая клиентов вашего класса.

std::array в C ++ 11, практически только для статических данных. Массивы в стиле C имеют три важных преимущества передstd::vector:

Они не требуют динамического размещения. По этой причине предпочтительнее использовать массивы в стиле Си, если у вас много очень маленьких массивов. Скажите что-то вроде точки n-измерения:

template <typename T, int dims>
class Point
{
    T myData[dims];
// ...
};

Как правило, можно представить, чтоdims будет очень маленьким (2 или 3),T встроенный тип double) и что вы можете в конечном итогеstd::vector<Point> с миллионами элементов. Вы определенно не хотите, чтобы миллионы динамических распределений 3 удваивались.

Поддержка статической инициализации. Это проблема только для статических данных, где что-то вроде:

struct Data { int i; char const* s; };
Data const ourData[] =
{
    { 1, "one" },
    { 2, "two" },
    //  ...
};

Это часто предпочтительнее использования вектора (иstd::string), поскольку он избегаетвс порядок проблем инициализации; данные предварительно загружены, прежде чем какой-либо фактический код может быть выполнен.

Наконец, в связи с вышесказанным, компилятор может вычислить фактический размер массива из инициализаторов. Вы не должны считать их.

Если у тебя есть доступ к C ++ 11,std::array решает первые две проблемы и, безусловно, должен использоваться в первом случае вместо массивов в стиле C. Однако он не относится к третьему, и наличие в компиляторе массива в соответствии с количеством инициализаторов все еще является веской причиной для предпочтения массивов в стиле

array вc++ дает вам фиксированный размер быстрой альтернативы динамического размераstd::vector а такжеstd::list. std :: массив является одним из дополнений вc++11. Он обеспечивает преимущества контейнеров std, в то же время обеспечивая семантику агрегированных типов массивов в стиле C.

Так вc++11 я бы обязательно использовалstd::array, где это требуется, над вектором. Но я бы избегал массива в стиле C вC++03.

: для размещения массивов в стеке и std :: vector для кучи. Но ни один из них не поддерживает неродное выравнивание. Если вы используете какой-либо числовой код, для которого вы хотите использовать инструкции SSE или VPX (таким образом, требуя выравнивания по 128 или 256 байт соответственно), массивы C по-прежнему кажутся вам лучшим выбором.

ВАШ ОТВЕТ НА ВОПРОС