C ++:创建无穷大的整数向量

问题描述 投票:0回答:4

我正在研究算法,我需要初始化int的向量:

std::vector<int> subs(10)

固定长度的值:

{-inf, +inf, +inf …. }

This是我读到的可以使用MAX_INT的地方,但它并不安静,因为我的vector的元素应该大于任何可能的int值。

我喜欢从this answer超载比较运算符方法,但如果应该有infinitytype,如何使用int类对象初始化向量?

或许你知道更好的解决方案吗?

谢谢。

c++ vector initialization int
4个回答
2
投票

解决方案取决于您的算法(或算法的实现)具有以下假设:

  • 您可以将元素大小增加到int以外(例如,如果你的sizeof(int)是4,使用int64_t),并初始化为(int64_t) 1 + std::numeric_limits<int>:max()(对于负值也是如此)。但也许你的算法假设你不能通过加上乘以正数来“超越无穷大”?
  • 您可以像其他答案一样使用std::variant,在int和infinity之间进行选择;但也许你的算法假设你的元素表现得像数字?
  • 您可以使用基于比率的“数字”类,确保它不会获得除无限之外的非整数值。
  • 你可以让你的算法特殊情况下的最大和最小整数
  • 您可以使用支持 - / + infinity的floats或doubles,并将它们限制为完整性。
  • 等等

所以,它真的只是取决于并没有一个适合所有人的解决方案。


1
投票

AS已经在评论中说过,你不能在int中存储无穷大值:这种类型的所有值都是明确定义的和有限的。

如果你可以使用向量作为无限的向量的向量,那么考虑使用这样的类型:

struct infinite
{ };

bool operator < (int, infinite)
{
    return true;
}

0
投票

您可以使用支持双调度的变量(例如,boost::variant),它存储intinfinitytype(应该存储无穷大的符号,例如在bool中),然后通过访问者实现比较运算符。

但是我认为如果你只使用double而不是int会更简单,并且每当你取出一个非无穷大的值时,将它转换为int。如果性能不是一个很大的问题,那么它将正常工作(可能仍然比变体更快)。如果你需要很好的性能,那么只需使用MAX_INT并完成它。


0
投票

您已经意识到“无限”类型的概念,但该实现只能包含无限值。还有另一个相关的想法:

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

© www.soinside.com 2019 - 2024. All rights reserved.