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