【问题标题】:How to check if array index exists如何检查数组索引是否存在
【发布时间】:2014-12-05 15:24:11
【问题描述】:

我有一个指针* double 数组,基本上,它们按任意顺序编入索引。

例如,

double[0][0] = 80.0
double[3][0] = 56.8
double[4][0] = 56.7

例如,我如何检查double[1][2] 是否存在,如果不存在则创建一个。

我不打算使用vectors 或任何'fancy',只是简单的数组。

【问题讨论】:

  • 仅使用普通数组就不行。您需要以某种方式跟踪大小。
  • 如果您打算在已知大小的数组上执行此操作,您可以使用默认值初始化所有索引,然后进行简单检查。如果你想创建一个可变数组,它的大小会动态增长,那么我建议使用“更高级”的东西。
  • 你最好的办法是用一些哨兵值初始化数组,一个真实数据永远不会有的值。然后if(array[3][4]==SENTINEL) {等等。
  • 完整的数组大小是在代码声明数组时创建的。之后的任何事情都只是填写和读取值。 --or-- 你的意思是:如何判断一个数组条目是否已经被填写?
  • 正确答案取决于您是否将array 声明为double array[N][M]double *array[N]double **array。在第一种情况下,只要0 <= x < N0 <= y < M,那么array[x][y] 就存在(尽管如果你从未初始化它可能是垃圾)。在其他情况下,您必须解释分配是如何完成的......

标签: c++ c arrays indexing


【解决方案1】:

嗯。好吧,如果你真的想用普通数组来做(为什么?),你可以做的不多,只能依靠一个神奇的值。我建议std::numeric_limits<double>::quiet_NaN()(NaN = 不是数字)。也就是说:

#include <algorithm>
#include <limits>

double data[10][20]; // maximum dimensions mandatory with arrays. There's
                     // no way around that, and you can't grow it later.

std::fill(data[0], data[0] + 10 * 20, std::numeric_limits<double>::quiet_NaN());

然后您可以稍后检查数组中是否有真正的值,如下所示:

if(!std::isnan(data[1][2])) {          // #include <cmath> for std::isnan
  // oh, look, there's a value here!
} else {
  // Nothing here yet. Better fill it
  data[1][2] = 123.0;
}

警告:如果您的计算本身可能会产生 NaN 值,那么您就大错特错了。例如,如果您尝试计算 0.0 / 0.0std::sqrt(-1)std::log(-1) 或其他在实数中没有定义值的东西,就会发生这种情况。如果您的计算产生 NaN 并将其写入数组,则此方法的作用就像该值从未写入那里一样。

【讨论】:

  • 当你声明数组时,你必须给它一个大小。例如,'double myArray[20][20];'所以你知道最大的偏移量将是 myArray[19][19] (偏移量在 C 中从 0 开始)
  • 我有点困惑你为什么要告诉我这个。
  • @user3629249 你好像指的是我同时删除的评论?
  • 哦,好的。我想这是有道理的。
  • @Wintermute 我发现这个问题非常模糊。你确实得到了指针* double 的东西?
猜你喜欢
  • 2013-03-21
  • 2010-09-20
  • 2020-05-26
  • 2012-10-17
  • 1970-01-01
  • 2012-03-10
  • 2011-01-09
  • 2021-07-22
  • 2013-02-24
相关资源
最近更新 更多