C++ 既然我们有了std::array,那么C风格的数组还有什么用途呢?
C++ 既然我们有了std::array,那么C风格的数组还有什么用途呢?,c++,arrays,c++11,initialization,C++,Arrays,C++11,Initialization,std::array远远优于C数组。即使我想与遗留代码进行互操作,我也可以使用std::array::data()。有什么理由我会想要一个老式的阵列吗?没有。说实话。30个字符 当然,您需要C数组来实现std::array,但这并不是用户想要C数组的真正原因。此外,不,std::array的性能不低于C数组,并且具有边界检查访问的选项。最后,任何C++程序都依赖于标准库是完全合理的——这是标准的一点——如果你没有访问标准库,那么编译器是不符合的,问题是用“C++”标记的,而不是。“C++和那些因
std::array
远远优于C数组。即使我想与遗留代码进行互操作,我也可以使用std::array::data()
。有什么理由我会想要一个老式的阵列吗?没有。说实话。30个字符
当然,您需要C数组来实现std::array
,但这并不是用户想要C数组的真正原因。此外,不,std::array
的性能不低于C数组,并且具有边界检查访问的选项。最后,任何C++程序都依赖于标准库是完全合理的——这是标准的一点——如果你没有访问标准库,那么编译器是不符合的,问题是用“C++”标记的,而不是。“C++和那些因为觉得不合适而错过了一半规范的非C++的东西。”
std::array
除非我遗漏了什么(我没有太密切地关注标准的最新变化),C样式数组的大多数用法仍然保留。
std::array
确实允许静态初始化,但它仍然不会为您计算初始值设定项。而且因为在std::array
之前,C样式数组的唯一实际用法是用于静态初始化的表
大致如下:
MyStruct const table[] =
{
{ something1, otherthing1 },
// ...
};
使用常用的开始
和结束
模板功能(在
(C++11)对它们进行迭代,但从未提及大小,编译器根据初始值设定项的数量确定大小
编辑:我忘了另一件事:字符串文字仍然是C样式的数组;也就是说,使用类型
char[]
。我不认为任何人会因为我们有std::array
而排除使用字符串文字。例如,使用多维数组似乎比使用std::array
更容易
char c_arr[5][6][7];
相对于
std::array<std::array<std::array<char, 7>, 6>, 5> cpp_arr;
std::数组cpp\u arr;
同样由于C数组的自动衰减特性,上面示例中的
C_arr[i]
将衰减为指针,您只需将其余维度作为另外两个参数传递。我的观点是C_arr
复制成本不高。但是,cpp_arr[i]
的复制成本非常高。正如Sumant所说,多维数组与内置C数组一起使用要比与std::array一起使用容易得多
嵌套时,std::array
可能会变得非常难以读取,并且不必要地冗长
例如:
std::array<std::array<int, 3>, 3> arr1;
另外,请注意,嵌套std::array
时,begin()
、end()
和size()
都返回无意义的值
出于这些原因,我创建了自己的固定大小多维数组容器,array\u 2d
和array\u 3d
。它们类似于std::array
,但用于二维和三维的多维数组。它们比内置多维数组更安全,性能也不差。我没有包含容器用于维数大于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 }
}};
//创建一个3 x 5的数组(注意额外的一对大括号)
fsma::数组_2d 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 }
}};
完整文档可在以下位置获得:
您可以在此处下载该库:
< p> C++中的C样式数组实际上比实际的C数组少多了。不同的是,在C中,数组类型可以有运行时大小。下面是有效的C代码,但它既不能用C++ C样式数组来表达,也不能用C++ <代码>数组< /C> >类型:
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::Stase< /Cuff>实现,因为<代码> Bar <代码>在编译时不知道,它需要使用C++中的C风格数组或“代码> STD::vector < /COD>
虽然第一个例子可以用C++来比较容易地表达(虽然需要<代码>新[] ]/COD>和 >,但是在C++中,没有<代码> STD::向量< /代码>:不能实现下列内容:
<> Po>,对于C++的代码行>代码> int(*)[Wist] 不能使用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.< /P> < P>可能是<代码>:ST::数组< /代码>不是慢的。但是我用简单的存储和从STD::
请参见以下基准测试结果(在VS2013更新4的W8.1中):
根据负号,我使用的代码在pastebin()中
基准类代码为
我对基准测试了解不多…我的代码可能有缺陷告诉我std::array
的性能如何低于C数组。:“数组实现不需要进行绑定检查。然而,boost中的实现对操作符[]实现了这一点,而不是fo
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);
}
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;
}
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