Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 既然我们有了std::array,那么C风格的数组还有什么用途呢?_C++_Arrays_C++11_Initialization - Fatal编程技术网

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
  • 如果您不想使用STL或无法
  • 演出

  • 除非我遗漏了什么(我没有太密切地关注标准的最新变化),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