在C++中不表示任何内容
Representing nothing in C++
我有一个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位。
- C++ 表示 NIC 收到数据时没有收到任何内容
- 是否有任何内置的哈希图函数来处理 c++ 中的值输入?
- std::任何只用于移动的模板,其中副本ctor内的static_assert等于编译错误,但为什么
- 整数文本太大,无法用任何整数类型表示--C++
- 是否有任何内置函数可以检查给定的两个数字在给定整数数组中的顺序是否相同?
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- C++ 中是否有任何内置阶乘函数?
- 如何在C++中接收任何类型的函数参数并获取函数内传递变量的类型?
- 是否有任何内置函数可以告诉编译器分支是否可预测
- 如何获得从负无穷大到无穷大的范围以在 0 到 1 的范围内表示
- 我需要在C /C#中使用图形.我可以使用任何内置的C /C#库
- 是否有任何内置类可以处理C 中的大整数值
- c ++中是否有任何内置功能可以在计划的时间运行任务
- 是否有任何内置的 UTF 在 c++ 在窗口中
- 在VC++2010中执行任何内置的ARRAY函数
- C++:如何在不使用任何内置函数的情况下将字符串转换为整数
- 是否有任何内置的CUDA函数允许CUDA内核向主机代码报告错误?
- 我如何在常数时间(O(1))内获得字母表(1-26)中字符的数值/位置,而不使用任何内置方法或函数
- C++中的任何内置哈希方法
- c++库中的任何内置夹子方法