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

时间:2018-02-28 10:49:56

标签: c++ vector initialization int

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

std::vector<int> subs(10)

固定长度的

值:

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

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

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

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

谢谢。

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

AS已经在评论中说过,您无法在int中存储无穷大值:此类型的所有值都已明确定义且有限

如果你可以使用某些的向量作为int的无穷大,那么考虑使用这样的类型:

struct infinite
{ };

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

答案 2 :(得分:0)

您可以使用支持双重调度的变体(例如,boost::variant),该变体存储intinfinitytype(应存储无限的符号,用于例如,在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