c++ 不合逻辑 >= 处理 vector.size() 时的比较很可能是由于 size_type 是无符号的

2024-01-30

在处理 vector.size() 又名 size_type 时,我可以使用一些帮助来澄清这种奇怪的比较

vector<cv::Mat> rebuiltFaces;
int rebuildIndex = 1;
cout << "rebuiltFaces size is " << rebuiltFaces.size() << endl;

while( rebuildIndex >= rebuiltFaces.size() ) {
    cout << (rebuildIndex >= rebuiltFaces.size()) << " , " << rebuildIndex << " >= " << rebuiltFaces.size() << endl;
    --rebuildIndex;
}


我从控制台得到的是

rebuiltFaces size is 0
1 , 1 >= 0
1 , 0 >= 0
1 , -1 >= 0
1 , -2 >= 0
1 , -3 >= 0

如果我不得不猜测,我会说编译器盲目地将rebuildIndex转换为无符号和+-,但导致事情表现得很奇怪,但我真的不确定。有人知道吗?


正如其他人指出的那样,这是由于 反直觉规则 C++ 适用于比较不同值的值 签名性;该标准要求编译器将两个值转换为unsigned。因此,通常认为最佳实践是 避免unsigned除非你正在进行位操作(其中实际的 数值无关)。遗憾的是,标准容器 不要遵循这个最佳实践。

如果你知道向量的大小永远不会溢出int,那么你可以直接投射结果std::vector<>::size() to int并完成它。然而,这并非没有危险。作为马克 吐温说:“杀死你的不是你不知道的东西,而是你知道的东西。” 确信这不是真的。”如果没有验证,那么 插入到向量中,那么更安全的测试是:

while ( rebuildFaces.size() <= INT_MAX
        && rebuildIndex >= (int)rebuildFaces.size() )

或者如果你真的不希望出现这种情况,并准备中止 发生时,设计(或找到)一个checked_cast功能,并使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 不合逻辑 >= 处理 vector.size() 时的比较很可能是由于 size_type 是无符号的 的相关文章

随机推荐

  • 是否可以限制每秒运行的 goroutine 数量?

    我有一个 URL 列表 我需要使用 goroutine 来同时触发 HTTP 请求 是否有办法检查并限制每秒发送的 HTTP 请求数量 Go 中的一个非常简单的版本是对漏桶 https en wikipedia org wiki Leaky
  • 如何从子查询返回多个值

    SELECT state business a report FROM base WHERE state IN SELECT a state FROM heart a join SELECT CAST MAX percent adults
  • 按 ID 累积总和,有滞后

    我想通过 id 创建一个累积和 但是 它不应该对属于正在计算的行的值求和 我已经尝试过使用 cumsum 了 但是 我不知道如何添加一条语句 指定不添加求和行的金额 我正在寻找的结果列是第三列 名为 sum 例如 对于 id 1 第一行 s
  • PySimpleGUI 表元素。如何读取选定的行?

    我是 Python 的初学者 甚至是 PySimpleGui 的初学者 我非常喜欢使用它来创建带有 GU 界面的小型应用程序 我遇到的问题是关于表格元素的 到目前为止 我已成功使用 sqlite 数据库中的数据填充表元素 一旦表格准备好数据
  • 如何将 `git diff --color-words` 的输出转换为 HTML?

    对于处理以纯文本形式存储的散文文本 我真的很喜欢以下输出git diff color words 但我不喜欢它依赖于 ANSI 终端转义序列的方式 我希望获得可用于转换为 HTML 的输出 某种用户友好的原始字符显示 或生成有关两个文件之间
  • HTML5 可以通过其视频标签播放 .mpd Manifest 文件吗?

    我有一个 Movie Manifest mpd 文件 由 5 个 webm 视频流 由不同大小和 bps 组成 和 1 个音频文件组成 我要问的问题是 可以通过 简单 的HTML5视频标签来播放吗 我已经尝试过这个 但它不起作用
  • 随机卡牌生成

    我需要从数组中随机生成三张卡 我有 52 张卡名称的数组 从卡1到卡52 String rank new String 52 for int i 0 i
  • ARMv8 浮点输出内联汇编

    为了添加两个整数 我写 int sum asm volatile add 0 x3 x4 r sum 我怎样才能用两个浮动来做到这一点 我试过 float sum asm volatile fadd 0 s3 s4 r sum 但这给了我一
  • 如何创建读取 shebang 的 Sublime Text 3 构建系统

    如何在 Sublime Text 3 中创建构建系统 cmd 是否被替换为 shebang 如果存在 更具体地说 是否有办法更改 Python 构建系统以使用 shebang 中指定的 Python 版本 并在不存在 shebang 的情况
  • AngularJS:为什么 ng-model 值没有在范围变量中更新

    我正在使用 jquery timepicker 插件及其角度指令 当我从 javascript 重置范围值时 同时范围值不会更新 我尝试对 timepicker 指令文件进行更改 但没有成功 例子 选择开始时间 1 00AM 然后结束时间自
  • geom_text 适用于 R 中的直方图?

    想知道是否geom text效劳于hist 尝试了下面的代码 似乎没有效果 我只想在为每个直方图桶绘制每个条形时显示标签 属于特定直方图桶的元素数量 任何解决方案表示赞赏 谢谢 p lt hist df foo main title xla
  • 从存储为节点缓冲区的字节数组创建类型化数组

    从节点docs https nodejs org api buffer html buffer buf slice start end关于从缓冲区创建类型化数组 缓冲区的内存被解释为数组 而不是字节数组 那 是 new Uint32Arra
  • 后台进程重定向到 COPROC

    在下面的测试脚本中 我运行一个基本协进程 echo内置 在后台运行 附加其标准输出 bin bash TEST 1 coproc bin sleep 100 echo gt COPROC 1 该脚本总是失败 没有明显的原因 给出输出 tes
  • 如何确定 .Net DLL 是否用于 GUI 应用程序或 Web 服务?

    如何确定 Net DLL 是否在 Windows GUI 应用程序或 Web 服务中运行 我有一个低级类 在两个应用程序之间共享 并且需要在 Web 服务中使用它时禁用消息框 Windows 应用程序有超过 200 个解决方案 我无法重构现
  • 将 !important 应用于具有多个选项的字体系列

    如何将 important 应用于以下样式 font family Trebuchet MS Verdana Helvetica Sans Serif 我已经尝试过这个 但不起作用 font family Trebuchet MS Verd
  • Prolog 程序返回命题公式中的原子

    我是序言新手 正在尝试编写一个返回atoms在一个结构良好的命题公式中 例如查询ats and q imp or p q neg p As 应该返回 p q for As 下面是我的代码 它返回的公式为As 我不知道该怎么做才能拆分sing
  • IIS7 URL从根目录重定向到子目录[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用带有 IIS7 的 Windows Server 2008 我需要重定向访问的用户www mysite com to wwww
  • oracle中的触发器

    触发器可以增强或阻碍性能的条件是什么 何时使用系统中的触发器 何时不使用触发器 如何使用触发器来施加复杂的约束 执行触发器总是会产生一些开销 至少 您要为导致触发器触发的每一行执行从 SQL 引擎到 PL SQL 引擎的上下文转换 虽然触发
  • JavaFX ObservableList - 添加项目导致 ConcurrentModificationException

    我有一张桌子Albums用户可以过滤和排序 这是该表的样子 正如您所看到的 这些列是可排序的 并且顶部有一个文本框 当前正在过滤其中包含字符串 cu 的专辑 一切都很完美填充专辑列表后 但是 如果我在填充专辑列表时尝试排序或过滤 我会得到一
  • c++ 不合逻辑 >= 处理 vector.size() 时的比较很可能是由于 size_type 是无符号的

    在处理 vector size 又名 size type 时 我可以使用一些帮助来澄清这种奇怪的比较 vector