Массивы в стиле C, доступные в C ++, на самом деле гораздо менее универсальны, чем реальные C-массивы. Разница в том, что в C типы массивов могут иметь размеры runtime . Следующее является допустимым кодом C, но его нельзя выразить ни с помощью массивов в стиле C ++, ни с типами C ++ array<>
:
void foo(int bar) {
double tempArray[bar];
//Do something with the bar elements in tempArray.
}
В C ++ вам придется выделить временный массив в куче:
void foo(int bar) {
double* tempArray = new double[bar];
//Do something with the bar elements behind tempArray.
delete[] tempArray;
}
Этого нельзя достичь с помощью std::array<>
, поскольку bar
не известен во время компиляции, для этого требуется использование массивов в стиле C в C ++ или std::vector<>
.
Хотя первый пример можно относительно легко выразить на C ++ (хотя для этого требуется new[]
и delete[]
), в C ++ без std::vector<>
невозможно:
:
void smoothImage(int width, int height, int (*pixels)[width]) {
int (*copy)[width] = malloc(height*sizeof(*copy));
memcpy(copy, pixels, height*sizeof(*copy));
for(y = height; y--; ) {
for(x = width; x--; ) {
pixels[y][x] = //compute smoothed value based on data around copy[y][x]
}
}
free(copy);
}
Дело в том, что указатели на строковые массивы int (*)[width]
не могут использовать ширину среды выполнения в C ++, что делает любой код манипуляции с изображениями намного сложнее в C ++, чем в C. Типичная реализация C ++ манипуляции изображениями Пример будет выглядеть так:
void smoothImage(int width, int height, int* pixels) {
int* copy = new int[height*width];
memcpy(copy, pixels, height*width*sizeof(*copy));
for(y = height; y--; ) {
for(x = width; x--; ) {
pixels[y*width + x] = //compute smoothed value based on data around copy[y*width + x]
}
}
delete[] copy;
}
Этот код выполняет в точности те же вычисления, что и код C, описанный выше, но он должен выполнять вычисление индекса вручную везде, где используются индексы . Для двумерного случая это все еще возможно (даже при том, что у него есть много возможностей ошибиться при расчете индекса). Однако в 3D-случае это становится очень неприятным.
Мне нравится писать код на C ++. Но всякий раз, когда мне нужно манипулировать многомерными данными, я действительно спрашиваю себя, должен ли я переместить эту часть кода в C.