【发布时间】:2021-05-21 23:45:19
【问题描述】:
如果你想用默认值 n 填充数组,我想知道什么是理想的方法:
#include <cstring> // for memset
#include <algorithm> // for fill_n
static constexpr int N = 100;
int a[N];
static constexpr int defaultValue = -1;
void* memset( void* dest, int ch, std::size_t count );
memset(a, defaultValue, sizeof(a));
(memset) 将值 ch 转换为 unsigned char 并将其复制到 dest 指向的对象的第一个 count 个字符中。如果对象是潜在重叠的子对象或者不是 TriviallyCopyable(例如,标量、C 兼容的结构或普通可复制类型的数组),则行为未定义。如果 count 大于 dest 指向的对象的大小,则行为未定义。
或
constexpr OutputIt fill_n( OutputIt first, Size count, const T& value );
fill_n(a, N, defaultValue);
(fill_n) 如果 count > 0,则将给定值分配给从 first 开始的范围内的第一个 count 元素。否则不执行任何操作。
我正在寻找见解,我当然知道如何阅读文档!
编辑:defaultValue 可能不仅仅是-1。
【问题讨论】:
-
对于普通类型,
fill_n可能会导致类似memset的操作,而对于其他类型,memset将无法将对象复制到位。我会坚持使用fill_n。两者都适用。 -
取决于你真正想做什么。
memset作用于字节,因此-1 被写入ints 数组中的每个字节。使用 -1 也可以,因为 -1 的 4 个字节与设置为 -1 的int具有相同的位模式。尝试使用 1,假设 32 位int,您将得到一个包含 16843009 (0x01010101) 的数组。 -
关于编辑和我上面的评论,如果您希望数组中的每个
int都将defaultValue作为默认值,那么听起来fill_n是唯一的选择。还要考虑如果defaultValue太大而无法放入单个字节怎么办。memset在这种情况下完全没用,因为它将给定的值降低到unsigned char.. -
您的观点很有趣,您可以将其添加到您的(正式)答案中