【问题标题】:Compare result of std::distance with an unsigned type将 std::distance 的结果与无符号类型进行比较
【发布时间】:2023-03-10 13:49:01
【问题描述】:

我希望将 std::vector 中元素的索引与无符号值进行比较。如果我直接比较喜欢;

if(std::distance(...)>min_distance) // true for some

我只是收到一个警告,但工作正常。但是,为了消除警告,如果我将 min_distance 转换为 int,我不会得到任何比较结果(尽管有)

if(std::distance(...)>(int)min_distance) // never true

具体的问题是什么?

【问题讨论】:

  • 你的向量有多大?您平台上的 std::difference_t 类型是什么?
  • distance() 的参数是什么?更完整的代码示例将有助于诊断。

标签: c++ casting


【解决方案1】:

试试:

if ( std::abs( std::distance( ... ) ) > min_distance )

std::distance 返回一个有符号值。我假设您正在尝试以-22 将被视为2 的方式获取距离。 abs 函数为您提供absolute value,这意味着无论输入的符号是什么,您总是会得到一个正值。

【讨论】:

  • 实际上,我确信在我的情况下距离将返回 >=0,因为我与开头进行比较并确保元素在里面。我的问题实际上是一个更普遍的选角问题。
  • 那么 min_distance 的值是多少?肯定大于0?你用的是什么编译器?我不明白为什么转换为“int”会导致问题......除非 min_distance 大于 2^31 ..
  • 某事。小于 10,顺便说一句,我正在使用 g++
  • 唉,我手头没有 G++,但是在 VS2010 下完美编译的快速测试:(
  • 在您的情况下,distance() 可能返回负值。正确调试它以获得根本原因。
【解决方案2】:

听起来distance 在某些情况下返回一个负数。通常它会将 int 转换为 unsigned 并且负数会变得足够大以大于您的条件。

在第二种情况下,您将比较一个负数与转换为int 的小正数。

您可以在将其用于比较之前立即打印来自distance 的结果来进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 2019-11-28
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多