首页 > 编程语言 >C++ 反向遍历 array 小记

C++ 反向遍历 array 小记

时间:2023-12-19 11:25:08浏览次数:33  
标签:arr 遍历 idx 符号 -- C++ array size

有时候需要逆向循环,例如从字符串的最右端遍历到最左端,需要注意一些细节!初学遇到一些 bug 记录在这里。

首先 arr.size() 的数据类型为 size_t,为无符号整型

对于 for (int idx = arr.size() - 1; idx >= 0; idx--):

  • 使用 int 作为 idx 的类型,有一定概率会编译失败,因为 size_t 的具体类型随实现而不同,可能和 int 无法兼容,所以建议直接使用 std::size_tauto
  • 另一个比较致命的问题,size_t 为无符号整型,这意味着, idx >= 0 会永远满足,当 idx-- 突破 0 时,会回到极大数字……

因此可以考虑 for (long idx = arr.size() - 1; idx >= 0; idx--),从无符号数变为有符号数,就可以正常执行循环并跳出了。
但是,这个方法同样存在 longsize_t 可能存在不匹配的情况(虽然风险比较小,但确实存在,原因大概是,从无符号数到有符号数的转变,是 implementation-defined behavior[1]

最优雅的方法应该是:

for (auto idx = arr.size() - 1; idx < bin.length(); --idx)
{
    // some code
}

虽然跳出循环的判别标准是 idx < bin.length(),与正向遍历的标准一致,但是 it works!原因上面提到了。


  1. https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior#4105123 ↩︎

标签:arr,遍历,idx,符号,--,C++,array,size
From: https://www.cnblogs.com/zkmjolnir/p/17881153.html

相关文章

  • C++U4-第09课-STL容器
    学习目标 STL  栈stack [入栈出栈] 【算法分析】栈的基本操作。【参考代码】#include<bits/stdc++.h>usingnamespacestd;intmain(){stack<int>st;intn;cin>>n;for(inti=1;i<=n;i++){intx;cin......
  • 【面试官版】【持续更新中】融合滤波算法+数据结构+激光视觉SLAM+C++面试题汇总
    C++部分什么时候需要写虚函数、什么时候需要写纯虚函数?只继承接口为纯虚函数强调覆盖父类重写,或者父类也需要实现一定的功能,为虚函数指针传参和引用传参区别?引用传参本质上是传递原参数地址,指针传参本质还是值传递,生成拷贝指针,拷贝指针和原指针指向的为同一块内存。因此改变......
  • 【我们尽量少说废话的讲完】C++红黑树原理
    红黑树的出现红黑树增删改查的时间复杂度都是O(logn)。如果插入的数据随机,那么使用二叉搜索树即可保证树接近平衡。此时增删改查的效率都为O(logN)。但如果插入的数据为有序的,此时二叉搜索树极其不平衡,退化为链表,时间复杂度降为O(N)。而红黑树就是为了应对这种极端情况。红黑......
  • 【纯代码复制粘贴即可使用】卡尔曼滤波的C++实现
    使用Eigen实现卡尔曼滤波。如果实现扩展卡尔曼滤波只需将H矩阵换成雅可比的求解。#ifndef_MYKALMAN_H#define_MYKALMAN_H#include<Eigen\Dense>classKalmanFilter{public:KalmanFilter(intstateSize,intmeasSize,intuSize);~KalmanFilter()=default;......
  • C++ 获取 vector 最大的 3 个数字
    假设现在有一个数组存储了成绩信息,要获得前三名#include<iostream>#include<vector>#include<algorithm>std::vector<int>scores{10,30,90,30,100,20,10,0,30,40,40,70,70};下面这种方法可以将前3名成绩复制到结果里,同时考虑到scores长度小于3的情况。......
  • c++学习书籍
      C++ Primer 第五版 第四版 对比 差异C++Primer是一本经典的C++编程教材,它的第五版与第四版有哪些不同点呢?首先,C++Primer第五版引入了C++11标准,讲解了C++11的新特性,例如auto类型推导、lambda表达式、右值引用、智能指针等等。这些新特性有助于提高C++程序的性能......
  • C++ Qt开发:TableWidget表格组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableWidget表格组件的常用方法及灵活运用。QTableWidget是Qt中用于显示表格数据的部件。它是......
  • C++ Qt开发:MdiArea多窗体组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍MdiArea`组件的常用方法及灵活运用。QMdiArea(MultipleDocumentInterfaceArea)是Qt中用于创建多......
  • C++基础 -9- 函数的默认参数
     ———————函数的默认参数——————— ......
  • 关于奇怪的 Array 函数:
    关于奇怪的Array函数:众所周知,我们可以通过Array函数来做以下事情。初始化一个指定长度的数组。设置数组的初始值。//1.Initializeanarrayofthespecifiedlengthconstarray1=Array(3)//[,,]//2.Settheinitialvalueofthearrayconstarray2=......