C ++:创建无穷大的整数向量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:创建无穷大的整数向量相关的知识,希望对你有一定的参考价值。
我正在研究算法,我需要初始化int的向量:
std::vector<int> subs(10)
固定长度的值:
{-inf, +inf, +inf …. }
This是我读到的可以使用MAX_INT
的地方,但它并不安静,因为我的vector的元素应该大于任何可能的int值。
我喜欢从this answer超载比较运算符方法,但如果应该有infinitytype
,如何使用int
类对象初始化向量?
或许你知道更好的解决方案吗?
谢谢。
解决方案取决于您的算法(或算法的实现)具有以下假设:
- 您可以将元素大小增加到int以外(例如,如果你的
sizeof(int)
是4,使用int64_t
),并初始化为(int64_t) 1 + std::numeric_limits<int>:max()
(对于负值也是如此)。但也许你的算法假设你不能通过加上乘以正数来“超越无穷大”? - 您可以像其他答案一样使用
std::variant
,在int和infinity之间进行选择;但也许你的算法假设你的元素表现得像数字? - 您可以使用基于比率的“数字”类,确保它不会获得除无限之外的非整数值。
- 你可以让你的算法特殊情况下的最大和最小整数
- 您可以使用支持 - / + infinity的
float
s或double
s,并将它们限制为完整性。 - 等等
所以,它真的只是取决于并没有一个适合所有人的解决方案。
AS已经在评论中说过,你不能在int
中存储无穷大值:这种类型的所有值都是明确定义的和有限的。
如果你可以使用向量作为无限的向量的向量,那么考虑使用这样的类型:
struct infinite
{ };
bool operator < (int, infinite)
{
return true;
}
您可以使用支持双调度的变量(例如,boost::variant),它存储int
或infinitytype
(应该存储无穷大的符号,例如在bool中),然后通过访问者实现比较运算符。
但是我认为如果你只使用double
而不是int
会更简单,并且每当你取出一个非无穷大的值时,将它转换为int。如果性能不是一个很大的问题,那么它将正常工作(可能仍然比变体更快)。如果你需要很好的性能,那么只需使用MAX_INT
并完成它。
您已经意识到“无限”类型的概念,但该实现只能包含无限值。还有另一个相关的想法:
struct extended_int {
enum {NEGINF, FINITE, POSINF} type;
int finiteValue; // Only meaningful when type==FINITE
bool operator<(extended_int rhs) {
if (this->type==POSINF) return false;
if (rhs.type==NEGINF) return false;
if (this->type==FINITE && rhs.type==POSINF) return false;
if (this->type==NEGINF && rhs.type==FINITE) return false;
assert(this->type==FINITE && rhs.type==FINITE);
return this->finiteValue < rhs.finiteValue)
}
// Implicitly converting ctor
constexpr extended_int(int value) : type(FINITE), finiteValue(value) { }
// And the two infinities
static constexpr extended_int posinf;
static constexpr extended_int neginf;
}
你现在有extended_int(5) < extended_int(6)
但extended_int(5) < extended_int::posinf
以上是关于C ++:创建无穷大的整数向量的主要内容,如果未能解决你的问题,请参考以下文章