我应该用啥值填充我的数组以指示空白?
Posted
技术标签:
【中文标题】我应该用啥值填充我的数组以指示空白?【英文标题】:What values should I fill my arrays with to indicate an empty space?我应该用什么值填充我的数组以指示空白? 【发布时间】:2022-01-12 01:27:37 【问题描述】:这更像是一个礼仪问题,但在创建新数组时,除了零之外,我应该使用什么值来指示数组中的空白空间? 例如:
int* arr;
arr = new int[10];
当我在上面的代码中创建一个新数组时,该数组将被十个零填充。我遇到的问题是我想在打印数组时使用下划线来指示空格,但是,我也有零作为数组中数据集的一部分。那么,我是否应该用一些不太可能出现在我的数据集(like -32000 for example)
中的任意值填充空数组,并将其用作空白空间的指示符,或者是否可以使用某种空值来代替这样我就可以知道该特定索引处的值肯定是一个空格?
【问题讨论】:
我很确定当你像上面的代码那样创建一个新数组时,它不会被十个零填充。至少,不符合 C++ 标准。int
的“空值”可能为零。因此,如果可能,您必须选择其他一些未使用的值。否则你可以有另一个数组bool is_used[10]
来跟踪使用情况,
没有普遍认可的价值。您将不得不查看您预期的数据集并选择一个带外值,该值不能存在于该集中。或者有一个与数据一起使用的状态标志来标记特定读数是否有效。
数组没有空格。虽然您可以使用 std::optional<int>
的数组
【参考方案1】:
您似乎要问的是所谓的哨兵m>——一些具有特殊含义的数据值。
关于哨兵的选择,使用你知道不会出现的东西,并使其成为命名常量。例如,您可以使用:
constexpr int NoValue = std::numeric_limits<int>::min();
如果您绝对需要整个整数范围,或者如果您无法可靠地清理输入以确保数据永远不会被接受为非空值,请考虑使用更大的数据类型来表示范围和一个哨兵,或使用std::optional
作为另一个答案中的建议。
或者,维护一个单独的数组来保存该信息。这样的数组只需要每个元素一位来表示该值是否为空,因此它仅意味着存储的部分增加,而不是将您的数据类型扩展到int
之外。这种方法权衡了内存使用与内存局部性,因为有关“空”的数据不会与数组中的值相邻存储,这可能会对缓存产生影响。
关于实际的初始化问题:您的数组未初始化,需要使用std::fill
或类似设置值。否则,如果您尝试使用未初始化的值,您的程序的行为是未定义的。请注意,有一种特殊情况:new int[100]()
将对内存进行零初始化。但是您不能使用该构造来使用任何其他值进行初始化。
考虑使用std::vector
来避免内存管理问题,并在不增加代码混乱的情况下提供非零值的初始化:
std::vector<int> arr(10, NoValue);
如您所见,有多种选择取决于您的程序要求及其输入规范。我希望这可以帮助您做出更明智的决定。
【讨论】:
【参考方案2】:我是否应该用一些不太可能出现在我的数据集中的任意值填充空数组
嗯,不太可能 与您确定不会出现在数据中的值不同,并且您因错误而得到的错误将是一个令人讨厌的错误。但是,一般来说,您通常确实对有效值的范围有所了解,并且使用该范围之外的哨兵值来指示无效确实更容易。 (如果您这样做,我建议您非常谨慎地清理进入程序的输入数据,即明确测试您的哨兵值是否意外地从外部来源传入。)
但是,如果没有这样的值,或者只是明确地声明您的意图,在现代 C++ 中处理这种情况的规范方法是使用 std::optional<int>
。标准库的optional
是一种将任何类型转换为可空类型的方法。
【讨论】:
【参考方案3】:请注意,*** 中通常不赞成“品味”问题。
话虽如此,这是我的偏好:
不能伪装成有效值的东西,比如 NaN,是一个很好的占位符。如果这不是一个选项,那么正如您所说,一个不会/不允许出现在数据集中的值有效。
【讨论】:
NaN 是一个特殊的浮点值。这个问题专门针对整数。关于 NaN,是的,这可能适用于浮点数据,但也有其自身的挑战。尤其是因为 NaN 测试不同于相等,而且 NaN 值通常会破坏所有逻辑和算术运算符。 我可以看出我的语言是多么混乱。我的意思是 NaN 或类似 NaN。我也解释了这不是一个选择。 “NaN 值通常会破坏所有逻辑和算术运算符”是的,这就是重点。当对无效值执行某些操作时,这将是非常明显的。以上是关于我应该用啥值填充我的数组以指示空白?的主要内容,如果未能解决你的问题,请参考以下文章