我正在研究算法,我需要初始化整数的向量:
std::vector<int> subs(10)
值:
{-inf, +inf, +inf …. }
This是我读到可以使用MAX_INT
的地方,但它并不安静,因为我的向量元素应该大于任何可能的int值。
我喜欢从this answer重载比较运算符方法,但如果应该有infinitytype
,如何使用int
类对象初始化向量?
或许你知道更好的解决方案吗?
谢谢。
答案 0 :(得分:2)
解决方案取决于您的算法(或算法的实现)具有以下假设:
sizeof(int)
为4,请使用int64_t
),并初始化为(int64_t) 1 + std::numeric_limits<int>:max()
(类似地,对于负值)。但也许你的算法假设你不能通过加上乘以正数来“超越无穷大”?std::variant
,在int和infinity之间进行选择;但也许你的算法假设你的元素表现得像数字?float
或double
s支持 - / + infinity,并将其限制为完整性。所以,再次,它真的只是取决于并且没有一个适合所有人的解决方案。
答案 1 :(得分:1)
AS已经在评论中说过,您无法在int
中存储无穷大值:此类型的所有值都已明确定义且有限。
如果你可以使用某些的向量作为int的无穷大,那么考虑使用这样的类型:
struct infinite
{ };
bool operator < (int, infinite)
{
return true;
}
答案 2 :(得分:0)
您可以使用支持双重调度的变体(例如,boost::variant),该变体存储int
或infinitytype
(应存储无限的符号,用于例如,在bool中),然后通过访问者实现比较运算符。
但我认为如果你只使用double
代替int
会更简单,并且每当你取出一个非无穷大的值时,将它转换为int。如果性能不是一个很大的问题,那么它将正常工作(可能仍然比变体更快)。如果您需要出色的表现,那么只需使用MAX_INT
即可完成。
答案 3 :(得分:0)
你已经意识到&#34;无限&#34;类型,但该实现只能 包含无限值。还有另一个相关的想法:
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