【问题标题】:Why can't we use std::fill() the same way for 1D and 2D arrays?为什么我们不能以相同的方式对一维和二维数组使用 std::fill() ?
【发布时间】:2015-03-31 18:16:37
【问题描述】:

我已经看到,如果我们有一个一维数组 int A[10],然后用任意值填充它,比如 0,我们使用 std::fill(A, A+10, 0)

对于一个二维数组 B[10][10],我们用 0 填充它: std::fill(&B[0][0], &B[0][0] + sizeof(B), 0

但是,我不明白为什么我们不能将一维数组 A 填充为: std::fill(&A[0], &A[0] + sizeof(A), 0

谁能解释一下?

【问题讨论】:

  • sizeof(A) 返回字节数,而不是项目数。 std::fill 函数需要项目数。

标签: c++


【解决方案1】:

sizeof(T) 返回T 类型的字节数。如果T 是一个数组类型(如果您折扣T[0]char 类型),它不会返回项目数。

对于数组中的项目数,它将是sizeof(T) / sizeof(T[0]),因此fill 函数将是这样的:

std::fill(&A[0], &A[0] + sizeof(A)/sizeof(A[0]), 0)

【讨论】:

  • 如果是二维数组会发生什么?
  • 您对二维数组的问题有同样的错误。同样的解决方案也适用于那里。
  • 根据这个答案(stackoverflow.com/a/3948314/2647199),填充二维数组的命令应该可以正常工作。
  • 看我的回答。看到我在哪里说“折扣 T 是 char 类型”吗?您链接到的答案仅在类型为char 时才有效。如果sizeof(T[0]) > 1 那么你必须按照我的回答所说的那样做。如果类型是char,我的回答甚至有效,所以如果你使用它,你不会丢失任何东西。
  • 我编辑了我的答案以强调一点,如果T[0] 不是 char 类型,则可以通过将数组大小(以字节为单位)除以每个元素(以字节为单位)。
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2014-01-08
相关资源
最近更新 更多