一个类似的讨论可以在这个问题中找到,另外还有一个问题,但我的情况略有不同,因为我处理的是动态分配的内存。
同时请注意,memset
不能很好地用于double
类型的值。
总之,我正在尝试使用std::fill
来填充一个动态分配的二维数组--
#include <iostream>
#include <algorithm>
using std::cout ; using std::endl ;
using std::fill ;
int main()
{
double **data ;
int row = 10, col = 10 ;
data = new double*[row] ;
for(int i = 0 ; i < col ; i++)
data[i] = new double[col];
// fill(&(data[0][0]),
// &(data[0][0]) + (row * col * sizeof(double)), 1); // approach 1
// fill(&(data[0][0]), &(data[0][0]) + (row * col), 1); // approach 2
// fill(data, data + (row * col * sizeof(double)), 1); // approach 3
// fill(&(data[0][0]),
// &(data[0][0]) +
// ((row * sizeof(double*)) +
// (col * sizeof(double))), 1); // approach 4
for(int i = 0 ; i < row ; i++) {
for(int j = 0 ; j < col ; j++)
cout << data[i][j] << " " ;
cout << endl ;
}
for(int i = 0 ; i < row ; i++)
delete [] data[i] ;
delete [] data ;
}
方法1: 根据我的理解,方法1应该是正确的代码,我从开头 &(data[0][0])
开始,数组的结尾应该位于 &(data[0][0]) + (row * col * sizeof(double))
,但运行时,我遇到了这个错误,但数组已经被填充--
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
*** Error in `./test': free(): invalid next size (fast): 0x0000000000da3070 ***
Aborted (core dumped)
方法二:然而,根据这个帖子,推荐使用方法二,但是我不太理解这段代码,因为sizeof(double)
缺失,而且我得到了这个输出--
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
*** Error in `./test': free(): invalid next size (fast): 0x0000000000bf5070 ***
Aborted (core dumped)
方法三:我不确定为什么这段代码不能编译,data
和&(data[0][0])
应该是同义的,对吗?
方法四:我不确定这是否正确。
- 我该如何实现?
std::fill
与两个嵌套循环相比是否有额外的好处?
const
成员移除了,只是因为它们在这里不需要,并且我想保持代码简单。但是,在真实的代码中,它们应该存在(以及其他一堆东西)。 - bames53.first
、.second
),也是因为这样静态类型可以防止像混淆Matrix::index_type
和SomethingElse::index_type
这样的问题。有时过多地使用通用类型如std::pair
可能会导致“字符串类型”问题。使用两个索引参数将要求我放弃[]
重载,这没关系,只是我偏好不这样做。 - bames53