在C++中不表示任何内容

Representing nothing in C++

本文关键字:任何内 表示 C++      更新时间:2023-10-16

我有一个std::vector<double>,但我希望其中一些双打是"nothing"/"不存在"。这是如何在C++中完成的?出于我的目的,我们可以有把握地假设所有"正常"双打都不是负数。

我应该让-1(或一些负数)表示"什么都没有"吗?这听起来不太优雅。

我应该创建一个包含"nothing"bool成员的Double类吗?这可能奏效,但似乎相当冗长和丑陋。

我应该创建一个Double类并创建一个"NoDouble:public Double"子类吗?这听起来更糟。

任何想法都将不胜感激。

如果您有IEEE浮点运算,则使用std::numeric_limits<double>::quiet_NaN()作为"nothing"的值。若要检查d是否为"无",请使用isnan(d)。此外,只有当d为NaN时,d != d才为真。NaN的问题是,当进行有缺陷的计算时,比如用零除以零或从负数中取平方根时,可能会得到它。任何使用NaN的计算结果也使用NaN。

如果你碰巧使用boost,你可以使用boost::optional<double>,它将其他级别的不可用性添加到NaN的一侧。然后会出现两种错误状态:无效号码和丢失号码。Boost包含许多有用的库,所以它无论如何都是有价值的工具。

如果您需要附加几个可能的原因来解释为什么它是"无",那么使用特殊的易出错类而不是double。Fallible是由Barnton和Nackman发明的,他们是备受赞誉的"科学与工程C++"一书。

你提到可能没有负数。在这种情况下,把替身包进课堂。你所拥有的不是技术上正常的double,所以你的类可以添加限制。

您可以使用std::vector<double *>。NULL指针表示一个空槽或空值。

您想要做的是保持向量不变,但也要使用bool向量,然后将其封装在类中。

在像样的编译器上使用bool的向量应该优化为每个布尔值1位,这样就可以解决空间问题。

class MyNullable {
public:
  double value;
  bool is_null;  
};
class NullableDoubles {
public:
  std::vector<double> values;
  std::vector<bool> nulls;
  void push_back(double d, bool is_null) {
    values.push_back(d);
    nulls.push_back(is_null);
  }
  MyNullable GetValue(int index) {
    MyNullable result;
    result.value = values[index];
    result.is_null = nulls[index];
    return result;
  }
  bool IsNull(int index) { return nulls[index]; }
  bool MakeNull(int index) { nulls[index] = false; }
};

我相信你可以看到将其封装在一两个模板中,然后为任何内容创建可为null的列表的价值(而不是双关语)。

template <class T>
class NullablesClass {
public:
  std::vector<T> values;
  std::vector<bool> nulls;
  void push_back(T d, bool is_null) {
    values.push_back(d);
    nulls.push_back(is_null);
  }
  MyNullable GetValue(int index) {
    MyNullableT<T> result;
    result.value = values[index];
    result.is_null = nulls[index];
    return result;
  }
  bool IsNull(int index) { return nulls[index]; }
  bool MakeNull(int index) { nulls[index] = false; }
  T GetValue(int index) { return values[index]; }
};

我希望可以。这似乎是能够使用所有可能的双值并知道它是否为NULL的最佳方式,同时使用最少的内存和最佳的内存对齐方式。向量是C++库中的一个专门化模板,因此每个bool实际上只能得到1位。