【问题标题】:Is it possible to use std::fill with a 2d C-style array? [duplicate]是否可以将 std::fill 与 2d C 样式数组一起使用? [复制]
【发布时间】:2014-09-29 06:29:06
【问题描述】:

假设我有:unsigned char my2darray[A][B];

是否可以使用std::fill 将二维数组的所有值设置为非0值?

我知道可以使用向量,但这是性能关键代码,我无法承受动态分配。不幸的是,不允许使用 C++11。

代码中当前使用的是memset(my2darray, 0x12, sizeof(my2darray));,但如果可能的话,我想将所有memset 替换为std::fill,因为数组的类型将来可能会成为一个类。

感谢任何类型的答案,而不仅仅是字符。

【问题讨论】:

  • std::array 怎么样?
  • @BaummitAugen not pre-c++11
  • 请注意,当前 memset 将使用 2 071 690 107 填充数组(当 my2darray 为 int 时)
  • @Erbureth 是的,更有理由不使用它!!!实际上我的代码中的数组是字节。我只是将其更改为 int 作为示例。我将其编辑为字符。

标签: c++


【解决方案1】:

是的,因为二维数组仍然是作为连续内存块分配的元素序列。

    std::fill (
      &my2darray[0][0],
      &my2darray[0][0] + sizeof(my2darray) / sizeof(my2darray[0][0]),
      none_zero_value);

【讨论】:

  • @WhozCraig 看起来和stackoverflow.com/questions/3948290/…中的答案一样
  • @NeilKirk 链接的答案是 char.sizeof() 在该示例中有效。对于这个问题,我应该是 &my2darray[0][0]+ A*B,或者 sizeof(my2darray)/sizeof(my2darray[0][0]), the choice is yours. I prefer the former in case my2darray` 实际上是 Type (*)[B] 而不是固定的。
  • @WhozCraig 我认为应该是一个部门;)
  • @EricZ 除法在阵列固定后正常工作。当数组只能通过行指针获得时它不会,因此我更喜欢更简单的数学,它在两种情况下都有效。
  • @WhozCraig 如果my2darray 是原始指针,则&my2darray[0][0] 是语法错误。
【解决方案2】:

如果您可以选择 std::fill_n 并且您不想处理数组上的 sizeof 操作,则可以使用以下命令:

std::fill_n(*my2darray,A*B,my_val)

【讨论】:

  • 为什么是*my2darray?不应该只是my2darray 吗?
  • ... 不应该;) 但是,值得一提的是,与 1d 相比,2d 数组是不同的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多