现在我们有了std :: array C样式数组还有什么用?

|
std::array
远远优于C数组。即使我想与遗留代码进行互操作,也可以使用
std::array::data()
。我有什么理由想要老式的阵列吗?     
已邀请:
除非我没有错过任何内容(我没有太严格地遵循标准的最新更改),否则仍然保留C样式数组的大部分使用。
std::array
允许静态初始化,但仍不会为您计算初​​始化次数。并且由于在
std::array
之前唯一真正使用C样式数组是用于静态初始化的表 遵循以下原则:
MyStruct const table[] =
{
    { something1, otherthing1 },
    //  ...
};
使用通常的
begin
end
模板功能(在 C ++ 11)对其进行迭代。无需提及大小,编译器根据初始化程序的数量确定大小。 编辑:我忘记的另一件事:字符串文字仍然是C样式数组;即类型为“ 7”。我认为没有人会因为我们有
std::array
而排除使用字符串文字。     
不,要坦率地说。并以30个字符为单位。 当然,您需要C数组来实现
std::array
,但这并不是用户想要C数组的真正原因。另外,不,
std::array
的性能不比C数组低,并且具有进行边界检查访问的选项。最后,对于任何C ++程序来说,完全依赖标准库是完全合理的(从某种意义上说它就是标准库),并且如果您无权访问标准库,那么您的编译器就不是-C,并且问题被标记为\“ C ++ \”,而不是\“ C ++和那些非C ++东西,因为他们觉得不合适而错过了规范的一半。\”。     
似乎使用多维数组对C数组要比
std::array
更容易。例如,
char c_arr[5][6][7];
相对于
std::array<std::array<std::array<char, 7>, 6>, 5> cpp_arr;
同样由于C数组的自动衰减特性,上例中的
c_arr[i]
将衰减到指针,您只需要将其余维度作为另外两个参数传递即可。我的意思是,复制15英镑并不昂贵。但是,ѭ16的复印成本很高。     
正如Sumant所说,多维数组比内置的C数组要容易得多,而不是
std::array
。 嵌套时,ѭ0会变得非常难以阅读和不必要的冗长。 例如:
std::array<std::array<int, 3>, 3> arr1; 
相比
char c_arr[3][3]; 
另外,请注意,当您嵌套
std::array
时,
begin()
end()
size()
都将返回无意义的值。 由于这些原因,我创建了自己的固定大小的多维数组容器
array_2d
array_3d
。它们类似于“ 0”,但适用于2维和3维的多维数组。它们比内置多维数组更安全,并且没有更糟糕的性能。我没有为尺寸大于3的多维数组提供容器,因为它们并不常见。在C ++ 0x中,可以创建可变参数模板版本,该版本支持任意数量的尺寸。 二维变量的示例:
//Create an array 3 x 5 (Notice the extra pair of braces) 

fsma::array_2d <double, 3, 5> my2darr = {{
    { 32.19, 47.29, 31.99, 19.11, 11.19},
    { 11.29, 22.49, 33.47, 17.29, 5.01 },
    { 41.97, 22.09, 9.76, 22.55, 6.22 }
}};
完整的文档可以在这里找到: http://fsma.googlecode.com/files/fsma.html 您可以在此处下载该库: http://fsma.googlecode.com/files/fsma.zip     
实际上,C ++中可用的C样式数组的功能远不如真正的C数组。区别在于,在C中,数组类型可以具有运行时大小。以下是有效的C代码,但不能用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 ++表示(尽管需要ѭ35和ѭ36),但是如果没有without34,则无法在C ++中实现以下功能:
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代码完全相同的计算,但是无论使用了哪里的索引,都需要手动执行索引计算。对于2D情况,这仍然是可行的(即使有很多机会使索引计算错误)。不过,在3D情况下,它真的很讨厌。 我喜欢用C ++编写代码。但是,每当需要处理多维数据时,我都会真正问自己是否应该将代码的这一部分移至C。     
可能是ѭ0不慢。但是我使用简单的存储做了一些基准测试,并从std :: array;中读取了内容; 请参阅以下基准测试结果(在W8.1,VS2013更新4上):
ARR_SIZE: 100 * 1000
Avrg = Tick / ARR_SIZE;

test_arr_without_init
==>VMem: 5.15Mb
==>PMem: 8.94Mb
==>Tick: 3132
==>Avrg: 0.03132
test_arr_with_init_array_at
==>VMem: 5.16Mb
==>PMem: 8.98Mb
==>Tick: 925
==>Avrg: 0.00925
test_arr_with_array_at
==>VMem: 5.16Mb
==>PMem: 8.97Mb
==>Tick: 769
==>Avrg: 0.00769
test_c_arr_without_init
==>VMem: 5.16Mb
==>PMem: 8.94Mb
==>Tick: 358
==>Avrg: 0.00358
test_c_arr_with_init
==>VMem: 5.16Mb
==>PMem: 8.94Mb
==>Tick: 305
==>Avrg: 0.00305
根据负号,我使用的代码在pastebin中(链接) 基准类代码在这里; 我对基准测试一无所知...我的代码可能有缺陷     
实现类似“ 0”的东西 如果您不想使用STL或不能 为了表现     

要回复问题请先登录注册