繁体   English   中英

如何在Qt / C ++中有效地重新初始化多维数组?

[英]How do I reinitialize a multidimensional array efficiently in Qt/C++?

在Qt中,我有一个3-D int数组(比如ID[x][y][z] ),我需要在计算过程中将其设置为0。

有没有使用循环的有效方法呢?

我需要重新初始化,因为我正在运行一个具有简单成本函数的特定算法来估计以下更详细的计算,并且我想使用相同的数据结构。 简单地覆盖数组不是一种选择,因为算法在写入之前会读取和检查条目。

迟早会有一个循环,但你可以将它委托给另一个更优化的功能。

此外,如果“3D数组”实际上是一些基本类型的数组数组(如intchar ),那么所有内存都是连续的,因此您可以使用单个函数调用来清除单个内存中的所有内存呼叫。

现在使用哪个功能; 在C ++中,基本上可以使用两个函数:旧的C memset函数和C ++ std::fill函数。 两者都应该正常工作,具有适当的强制转换和大小,以将所有数据设置为特定值。

在引擎盖下它(几乎)总是一个循环。 别担心,没有分支的循环非常有效。

如果你想要更具可读性,你可以使用像memsetstd::fill这样的函数来隐藏循环。

看看这个问题的答案: 使用std :: fill填充多维数组的安全方法是什么?

用户@JoachimPileborg和@GeorgSchölly已经在他们的答案中解释了哪些函数可用于重新初始化数组。 但是,我想添加一些示例代码并解释std::fill()memset()之间的区别。

我假设你想(重新)用0初始化你的数组。在这种情况下你可以这样做,如下面的代码所示:

#include <xutility>  // For std::fill().

int main(int argc, char* argv[])
{
    const int x = 2;
    const int y = 3;
    const int z = 5;
    const int arraySize = x * y * z;

    // Initialize array with 0.
    int ID[x][y][z] = {};

    // Use the array...

    // Either reinitialize array with 0 using std::fill()...
    std::fill(&ID[0][0][0], &ID[0][0][0] + arraySize, 0);

    // ...or reinitialize array with 0 using memset().
    memset(&ID[0][0][0], 0, sizeof(ID));

    // Reuse the array...

    return 0;
}

但是,如果要使用其他值(例如,1)初始化数组,则必须注意std::fill()memset()之间的关键区别:函数std::fill()设置数组的每个元素都指定了值。 相反,函数memset()将数组的每个字节设置为指定值。 这就是memset()将数组大小作为字节数( sizeof(ID) )的原因。

如果使用0初始化数组,则此差异不会导致问题。 但是,如果要使用非零值初始化数组的每个元素,则必须使用std::fill() ,因为memset()将产生错误的结果。

假设您要将数组的所有元素设置为1,那么以下代码行将产生预期结果:

std::fill(&ID[0][0][0], &ID[0][0][0] + arraySize, 1);

但是,如果以下列方式使用memset() ,则会得到不同的结果:

memset(&ID[0][0][0], 1, sizeof(ID));

如上所述,这行代码将每个字节设置为1.因此,数组的每个整数元素将设置为16843009,因为这等于十六进制值0x01010101。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM