Qt 关于容器的遍历迭代器的使用问题小结

 更新时间:2022年03月16日 11:24:17   作者:黑兔子  
Qt是一个跨平台的 C++ 开发库,主要用来开发图形用户界面程序,当然也可以开发不带界面的命令行程序,本文重点给大家介绍Qt 关于容器的遍历迭代器的使用问题小结,感兴趣的朋友一起看看吧

前言:

Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。

对容器进行遍历通常会使用迭代器,迭代器提供了一个统一的方法来访问容器中的项目。Qt的容器类提供了两种类型的迭代器,一个是Java风格迭代器,一个是STL风格迭代器。一般C++程序员会比较习惯使用STL风格迭代器。如果只想按顺序遍历一个容器中的项目的话,还可以使用Qt的foreach关键字。

面试时,也会对迭代器的相关只是进行提问,这里整理了STL风格迭代器和foreach关键字的相关知识。

STL风格迭代器:

每一个容器类都有两个STL风格迭代器类型,一个提供只读访问,一个提供读/写访问。只读迭代器要比读/写迭代器快很多,所以尽可能使用只读迭代器。

  • 只读迭代器:“容器类型”::const_iterator;例如:QList<QString>::const_iterator、QMap<QString, int>::const_iterator。
  • 读/写迭代器:“容器类型”::iterator;例如:QVector<QString>::iterator、QHash<QString, int>::iterator。

使用方法:

QList<QString> list;
list<<"A"<<"B"<<"C"<<"D";
//只读迭代器
QList<QString>::iterator iter;
for(iter = list.begin(); iter != list.end(); ++iter)
{
    qDebug() <<*iter;
}
//读/写迭代器
QList<QString>::const_iterator constIter;
for(constIter = list.constBegin(); constIter != list.constEnd(); ++constIter)
{
    qDebug() << *constIter;
}

其他:

  • STL风格迭代器的API模仿了数组的指针,例如,使用“++”操作符来向后移动迭代器使其指向下一个项目、使用“*”操作符返回迭代器指向的项目等。
  • STL风格迭代器是直接指向项目的。begin()函数返回容器中的第一个项目,end()函数返回容器最后一个项目的下一个假想的虚项目,这个项目标志着一个无效的位置,当列表为空时,begin()函数等价于end()函数。

  • STL风格迭代器中的“++”和“--”操作符既可以作为前缀(++iter,--iter)操作符,也可以作为后缀(i++,i--)操作符。当作为前缀时会先修改迭代器,然后返回修改改后的迭代器的一个引用;当作为后缀时,在修改迭代器以前会对其进行复制,然后返回这个复制。如果在表达式中不对返回值进行处理,那么最好使用前缀操作符,这样会更快一些。
  • STL风格迭代器常用API:
表达式行为
*i返回当前项目
++i移动迭代器到下一个项目
i += n使迭代器向后移动n个项目
--i移动迭代器到上一个项目
i -= n使迭代器向前移动n个项目
i-j返回迭代器i和迭代器j之间的项目的数目

foreach关键字:

foreach关键字是Qt向C++语言中添加的一个用来进行容器顺序遍历的关键字。

使用方法:

QList<QString> list;
list<<"A"<<"B"<<"C"<<"D";
foreach(QString str, list)
{
    qDebug() << str;
}

其他:

  • foreach其实是for循环的一个特殊简化版,写法类似于C++11中for的新写法,只不过foreach两个参数中间是“,”,C++11的for是“:”。
  • foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高。
  • 在foreach循环中也可以使用break和continue语句。

到此这篇关于Qt 关于容器的遍历迭代器的使用问题小结的文章就介绍到这了,更多相关Qt容器的遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++11新特性中auto 和 decltype 区别和联系

    C++11新特性中auto 和 decltype 区别和联系

    这篇文章主要介绍了C++11新特性中auto 和 decltype 区别和联系的相关资料,需要的朋友可以参考下
    2017-01-01
  • C++ Primer 第一部分基本语言

    C++ Primer 第一部分基本语言

    这篇文章主要介绍了C++ Primer 第一部分基本语言的相关资料,需要的朋友可以参考下
    2014-02-02
  • 深入探究C++中的容器适配器与仿函数技术

    深入探究C++中的容器适配器与仿函数技术

    C++中的容器适配器和仿函数是实现数据结构与算法的重要技术,容器适配器可以将一个容器转换为另一个形式,仿函数则可以自定义数据类型的比较、排序、计算等行为,提高程序的灵活性和可重用性
    2023-04-04
  • C语言实现学生籍贯信息记录簿

    C语言实现学生籍贯信息记录簿

    这篇文章主要为大家详细介绍了C语言实现学生籍贯信息记录簿,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • c异或运算 c异或运算符号

    c异或运算 c异或运算符号

    位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果
    2014-06-06
  • C语言中的盗贼(小偷)问题详解

    C语言中的盗贼(小偷)问题详解

    大家好,本篇文章主要讲的是C语言中的盗贼(小偷)问题详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C++ 微信多开的实现

    C++ 微信多开的实现

    本文主要介绍了C++ 微信多开的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++ OpenCV实现抖音"蓝线挑战"特效

    C++ OpenCV实现抖音"蓝线挑战"特效

    这篇文章主要介绍了如何使用OpenCV C++ 实现抖音上的特效“蓝线挑战”。文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,需要的可以参考一下
    2022-01-01
  • C++如何获取当前系统时间及格式化输出

    C++如何获取当前系统时间及格式化输出

    这篇文章主要介绍了C++如何获取当前系统时间及格式化输出的实例代码,主要用到time()及strftime()函数,通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C语言中求余运算符的使用解读

    C语言中求余运算符的使用解读

    这篇文章主要介绍了C语言中求余运算符的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论