Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 如何在Qt/C++;?_C++_Qt_Multidimensional Array - Fatal编程技术网

C++ 如何在Qt/C++;?

C++ 如何在Qt/C++;?,c++,qt,multidimensional-array,C++,Qt,Multidimensional Array,在Qt中,我有一个3-D int数组(比如说ID[x][y][z]),我需要在计算期间将其设置回0 有没有一种不使用循环的有效方法 我需要重新初始化,因为我正在运行一个带有简单代价函数的特定算法,以获得以下更详细计算的估计值,并且我希望使用相同的数据结构。简单地覆盖数组不是一个选项,因为算法在写入条目之前读取并检查它们。在引擎盖下,它(几乎)总是一个循环。别担心,没有分支的循环是非常有效的 如果希望更具可读性,可以使用类似memset或std::fill的函数来隐藏循环 看看这个问题的答案:迟早

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

有没有一种不使用循环的有效方法

我需要重新初始化,因为我正在运行一个带有简单代价函数的特定算法,以获得以下更详细计算的估计值,并且我希望使用相同的数据结构。简单地覆盖数组不是一个选项,因为算法在写入条目之前读取并检查它们。

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

如果希望更具可读性,可以使用类似
memset
std::fill
的函数来隐藏循环


看看这个问题的答案:

迟早会有一个循环,但您可以将它委托给另一个更优化的函数

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


现在使用哪个函数;在C++中,基本上可以使用两个函数:旧C函数和C++函数。这两种方法都可以很好地工作,使用适当的类型和大小,将所有数据设置为特定值。

用户@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;
}
但是,如果按以下方式使用
memset()
,则会得到不同的结果:

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

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

因此,在我的例子中,我将使用memset(&ID[0][0][0],0,sizeof(ID))?
memset(&ID[0][0][0], 1, sizeof(ID));