fill_n() 不允许更改变量值
fill_n() is not letting change variable value
我正在使用 fill_n() 函数来初始化我的数组值,但是我无法更改数组的值,它始终是初始值。
谁能解释一下这是为什么?
#include<iostream>
#include<ctime>
int main(){
//Matrix
int m[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
int v[3] = {5,6,7};
int result[3];// = {0,0,0};
int n = 0, i, j;
std::fill_n(result,sizeof(result),0);
clock_t time = clock();
while(n<1000){
n++;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
result[j] = result[j]+(v[i]*m[j][i]); //changing the values here.
}
}
}
time = clock() - time;
for(i=0;i<3;i++){
std::cout<<result[i]<<"\n";
}
std::cout<<"Execution time: "<<((float)time)/CLOCKS_PER_SEC<<"\n";
return 0;
}
代码的输出始终为 0。
std::fill_n(result,sizeof(result),0);
你要求用 0 填充前 sizeof(result)
个元素。
但是,result
中只有 3 个元素可用。因此,您越界编写并导致未定义的行为。您应该改为 std::fill_n(result, sizeof(result) / sizeof(result[0]), 0);
。
请注意 sizeof(result)
returns result
的大小 字节 ,而不是 元素 .
sizeof(result)
returns变量持有的字节数result
。由于result
是一个3int
的数组,它在内存中的大小是3 * sizeof(int)
,这(除非sizeof(int)
是1
)比[=18大得多=].因此,您正在编写传递数组边界并引发未定义的行为。
计算大小的实际方法是将 result
的整个大小除以其元素类型。即sizeof(result) / sizeof(int)
.
如果要将每个元素初始化为 0
,更简单的方法是 value-initialize 数组:
int result[3]{}; // or = {} (pre C++11)
array 类型 type 的元素数(或大小)将是 sizeof(array) / sizeof(类型). fill_n 所需的第二个参数是填充容器的元素数(在您的例子中,是一个 int 类型的数组),而不是数组的大小(以字节为单位)。自然地, sizeof(array) returns sizeof(type) 乘以元素的数量。
我正在使用 fill_n() 函数来初始化我的数组值,但是我无法更改数组的值,它始终是初始值。
谁能解释一下这是为什么?
#include<iostream>
#include<ctime>
int main(){
//Matrix
int m[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
int v[3] = {5,6,7};
int result[3];// = {0,0,0};
int n = 0, i, j;
std::fill_n(result,sizeof(result),0);
clock_t time = clock();
while(n<1000){
n++;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
result[j] = result[j]+(v[i]*m[j][i]); //changing the values here.
}
}
}
time = clock() - time;
for(i=0;i<3;i++){
std::cout<<result[i]<<"\n";
}
std::cout<<"Execution time: "<<((float)time)/CLOCKS_PER_SEC<<"\n";
return 0;
}
代码的输出始终为 0。
std::fill_n(result,sizeof(result),0);
你要求用 0 填充前 sizeof(result)
个元素。
但是,result
中只有 3 个元素可用。因此,您越界编写并导致未定义的行为。您应该改为 std::fill_n(result, sizeof(result) / sizeof(result[0]), 0);
。
请注意 sizeof(result)
returns result
的大小 字节 ,而不是 元素 .
sizeof(result)
returns变量持有的字节数result
。由于result
是一个3int
的数组,它在内存中的大小是3 * sizeof(int)
,这(除非sizeof(int)
是1
)比[=18大得多=].因此,您正在编写传递数组边界并引发未定义的行为。
计算大小的实际方法是将 result
的整个大小除以其元素类型。即sizeof(result) / sizeof(int)
.
如果要将每个元素初始化为 0
,更简单的方法是 value-initialize 数组:
int result[3]{}; // or = {} (pre C++11)
array 类型 type 的元素数(或大小)将是 sizeof(array) / sizeof(类型). fill_n 所需的第二个参数是填充容器的元素数(在您的例子中,是一个 int 类型的数组),而不是数组的大小(以字节为单位)。自然地, sizeof(array) returns sizeof(type) 乘以元素的数量。