Qt 容器 遍历 用法 学习

5 篇文章 0 订阅

Qt 容器 遍历 用法 学习

  • 本文主要是对容器迭代器的学习 废话很少 都是在点上 更多的是代码示列

  • 若有不对的地方希望大家批评指正

  • 程序中使用的类

  • #include <QCoreApplication>
    #include <QList>
    #include <QDebug>
    
    #include <QListIterator>
    #include <QMutableListIterator>
    
    #include <QMapIterator>
    #include <QMutableMapIterator>
    

容器类

非关联容器类
  • QList
  • QLinkedList 链表
  • QVector 占用连续内存
  • QStack 后进先出(LIFO)
  • QQueue 先进先出(FIFO)
关联容器类

存储键值对

  • QMap
  • QMultiMap 一键多值
  • QHash
  • QMutiHash
  • QSet
  • QCache 对缓存存储中对象的高效散列查找
  • QContiguousCache
    在这里插入图片描述

在这里插入图片描述

QList
  • 操作函数

    insert()	  <<		插入
    replace()				替换
    removeAt()				移除
    move()					移动
    swap()					交换
    append()				添加到表尾
    prepend()				添加到表头
    removeFirst()			移除第一项
    removeLast()			移除最后一项
    takeAt() takeFirst() takeLast()		获取此项并删除
    indexOf()				获取索引
    contains()				匹配相同项
    count()					某项出现的次数
    at  比 []  索引快
    
  /* QList */
  QList <QString> list;
  list<<"aa"<<"bb"<<"cc";     //插入项目
  if(list[1]=="bb") list[1]="ab";
  list.replace(2,"bc");       //"cc"替换为 "bc"
  qDebug()<<"the list is:";
  for(int i=0;i<list.size();++i)      //输出整个list
  {
      qDebug()<<list.at(i);
  }
  
  list.append("dd");      //添加到尾部
  list.prepend("hh");     //添加到头部
  QString str=list.takeAt(2);     //获取第3项 并删除
  qDebug()<<"at(2) item is :"<<str;
  qDebug()<<"the list is:";
  for(int i = 0;i<list.size();++i)
  {
      qDebug()<<list.at(i);
  }
  list.insert(2,"mm");        //在位置2插入数据 "mm"
  list.swap(1,3);     //交换项目1和项目3
  list.append("mm");
  qDebug()<<"the list is:";
  for(int i=0;i<list.size();++i)
  {
      qDebug()<<list.at(i);
  }
  qDebug()<<"contains 'mm'?"<<list.contains("mm");     //list中是否包含"mm"
  qDebug()<<"the 'mm' count:"<<list.count("mm");      //包含"mm"个数
  //默认返回匹配到的第一个的位置
  qDebug()<<"the first 'mm' index:"<<list.indexOf("mm");
  //从之指定位置(3)开始查找
  qDebug()<<"the second 'mm' index:"<<list.indexOf("mm",3);
QMap
  • 操作函数

    insert()			插入
    value()				获取值  不存在是默认返回0  可以设定返回的值
    []					获取一个值  不存在时 插入
    contains()			匹配是否有相同
    remove()			移除一个键
    take()				获取该键值并移除该键
    clear()				清空
    insertMulti()		插入一键多值
    
    /*QMap */
    QMap<QString,int>map;
    //插入
    map["one"] = 1;
    map["three"] = 3;
    map.insert("seven",7);
    qDebug()<<map;
    //获取键的值
    qDebug()<<"valuel:"<<map["six"];
    //使用"[]" 没有键值时 会自动插入
    qDebug()<<"contains 'six' ?"<<map.contains("six");
    qDebug()<<map;
    //使用value()函数获取键值  不存在时不会自动插入
    qDebug()<<map.value("five");
    qDebug()<<"contains 'five' ?"<<map.contains("five");
    //当键不存在时 value()默认返回0,可以设定该值  如设为9
    qDebug()<<"nine:"<<map.value("nine",9);
    //map默认键对应一个值   可以重新设置 以前的会被覆盖
    map.insert("ten",10);
    map.insert("ten",100);
    qDebug()<<"ten:"<<map.value("ten");
    //使用insertMuti()函数实现一键多值  用values()来获取值的列表
    map.insertMulti("two",2);
    map.insertMulti("two",20);
    //这样可以打印出源数据
    qDebug()<<"two:"<<map.values("two");
    //打印出每一项
    QList <int>values =map.values("two");
    for(int i=0;i<values.size();++i)
    {
        qDebug()<<values.at(i);
    }
    //使用QMultiMap  实现一键多值
    QMultiMap <QString,int>map1,map2,map3;
    map1.insert("values",1);
    map1.insert("values",2);
    map2.insert("values",3);
    //可以进行相加操作
    map3=map1+map2;
    qDebug()<<map3.values();
    //打印map3中的每一项
    QList <int> myvalues = map3.values("values");
    for(int i=0; i<myvalues.size();++i)
    {
        qDebug()<<myvalues.at(i);
    }
    
  • 容器可以嵌套使用 QMap<QString, QList<int> > "> >"之间必须有一个空格 否则编译器会将其当作“>>”

  • 值的类型可以是任何可赋值的数据类型(有一个默认的构造函数,一个复制构造函数,一个赋值操作运算符)像基本的类型(int,double) 、指针型、Qt的数据类型(QString QDate等) 但不包括 QObject 及其子类(QWidget、QDialog、QTimer等),但可以存储这些类的指针 QList<QWidget*>

遍历容器

java风格的Iterator
Iterator 迭代器

在这里插入图片描述

QListIterator
  • java风格的迭代器的指向不是项目 而是项目之间
    在这里插入图片描述
    在这里插入图片描述
/*iterators 迭代器*/
//java风格iterators  QList
QList<QString>list;
list<<"A"<<"B"<<"C"<<"D";
QListIterator<QString> i(list);     //创建list的只读iterator  list作为参数
qDebug()<<"the forward is:";        //正向遍历  (迭代器必须指向容器的最前面)
while (i.hasNext())
{
qDebug()<<i.next();
}
//    i.toBack();
qDebug()<<"the backwardis:";        //反向遍历  (迭代器必须指向容器的最后面)
while (i.hasPrevious())
{
qDebug()<<i.previous();

}
QMutableListIterator<QString>j(list);
j.toBack();                             //返回列表尾
while (j.hasPrevious()) {
QString str = j.previous();
if(str=="B") j.remove();
}
j.insert("Q");                           //在list最前面插入"Q"
j.toBack();
if(j.hasPrevious())j.previous() = "N";  //直接赋值
j.previous();
j.setValue("M");                         //使用setValue对上一次跳过的项赋值
j.toFront();
qDebug()<<"the forward is:";
while (j.hasNext()) {                     //正向遍历list
qDebug()<<j.next();
}
QMapIterator
  • 提供了跟QListIterator相同的函数 可以在返回项目的对象上使用 key() value()
QMap<QString,QString>map;
map.insert("Paris","France");
map.insert("Guatemala City","Guatemala");
map.insert("Mexico City","Mexico");
map.insert("Moscow","Russia");
QMapIterator<QString,QString>i(map);
while (i.hasNext()) {
    i.next();
    qDebug()<<i.key()<<":"<<i.value();
}
if(i.findPrevious("Mexico"))qDebug()<<"find 'Mexico'";      //向前查找键的值
QMutableMapIterator <QString,QString> j(map);
while(j.hasNext())
{
    if(j.next().key().endsWith("City"))                     //endWith() QString中的函数
    {
        j.remove();                                         //删除有"City"结尾的键的项
    }
}
while (j.hasPrevious()) {
    j.previous();
    qDebug()<<j.key()<<":"<<j.value();
}
STL风格迭代器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 其API模仿数组指针 通过“++”x向后移动 “*”指向迭代器返回的项 begin()指向第一个项目 end()指向最后一个项目的下一个虚项目 (end()标志着一个无效位置)
  • "++"作为前缀时 会先修改迭代器后返回迭代器的一个引用 作为后缀时 修改前会进行复制 后返回这个复制 若不对返回值做处理的话 用前缀(++i)更快
//STL风格迭代器
/*QList*/
QList<QString>list;
list<<"A"<<"B"<<"C"<<"D";
QList<QString>::iterator i;         //使用读写迭代器
qDebug()<<"the forward is :";
for(i = list.begin();i!=list.end();++i)
{
    *i=(*i).toLower();              //QString 的toLower()函数转换为小写
    qDebug()<<*i;
}
qDebug()<<"the backward is:";
while (i !=list.begin()) {
    --i;
    qDebug()<<*i;
}
QList<QString>::const_iterator j;   //使用只读Iterator
qDebug()<<"the forward is:";
for(j=list.constBegin();j!=list.constEnd();++j)
{
    qDebug()<<*j;
}
//QMap
QMap<QString,int>map;
map.insert("one",1);
map.insert("two",2);
map.insert("three",3);
QMap<QString,int>::const_iterator p;
qDebug()<<"the forward is :";
for(p = map.constBegin();p!=map.constEnd();++p)
{
    qDebug()<<p.key()<<":"<<p.value();
}
foreach关键字
//foreach关键字
QList<QString>list;
list<<"A"<<"B"<<"C";
qDebug()<<"the forward is:";
foreach(QString str,list)           //从list中获取每一项
{
qDebug()<<str;
}
QMap<QString,int>map;
map.insert("first",1);
map.insert("second",2);
map.insert("third",3);
qDebug()<<endl<<"the map is:";
foreach(QString str,map.keys())     //从map中获取每一项
qDebug()<<str<<":"<<map.value(str);
QMultiMap<QString,int>map2;
map2.insert("first",1);
map2.insert("first",2);
map2.insert("first",3);
map2.insert("second",2);
qDebug()<<endl<<"the map2 is:";
QList<QString>keys = map2.uniqueKeys(); //返回所有键的list
foreach(QString str,keys)               //遍历所有键
{
foreach(int i,map2.values(str))     //遍历键中的所有值
qDebug()<<str<<" : "<<i;
}
  • foreach循环也可以使用break continue
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt中,可以使用迭代器来遍历QVector容器。 使用QVector的begin()和end()函数来获取迭代器的起始位置和结束位置。 ```cpp QVector<int> vec; vec.append(1); vec.append(2); vec.append(3); vec.append(4); vec.append(5); QVector<int>::const_iterator iter; // 使用const_iterator代替iterator可以防止修改容器元素 for (iter = vec.begin(); iter != vec.end(); ++iter) { int value = *iter; // 通过解引用取得当前元素的值 qDebug() << value; } ``` 使用迭代器,可以从容器的开始位置一直迭代到末尾位置。每次迭代时,将迭代器指向的元素的值取出来使用。 需要注意的是,迭代器是指针的概念,因此可以使用解引用操作符(*)来获取迭代器指向的元素,可以使用自增操作符(++)将迭代器移动到下一个元素。 上述示例代码中的vec是QVector<int>类型的容器,迭代器iter的类型是QVector<int>::const_iterator,由于我们只是读取容器的元素而不修改它们,所以使用const_iterator以避免不必要的拷贝。 通过迭代器,我们可以方便地遍历QVector容器中的元素,并对每个元素进行相应的操作。 ### 回答2: 在Qt中,我们可以使用迭代器来遍历QVector容器。迭代器是指向容器某个元素的对象,通过逐个遍历迭代器,我们可以访问容器中的每个元素。 下面是一个遍历QVector容器的示例代码: ```cpp QVector<int> vector; vector << 1 << 2 << 3 << 4 << 5; // 使用迭代器遍历容器 QVector<int>::iterator it; for (it = vector.begin(); it != vector.end(); ++it) { int element = *it; // 对当前元素进行操作,例如打印输出 qDebug() << element; } ``` 在上面的代码中,我们首先创建了一个QVector容器并添加了一些整数元素。然后,我们使用`vector.begin()`获取容器的起始迭代器,使用`vector.end()`获取容器的结束迭代器。接下来,通过一个for循环,迭代器从起始位置一直遍历到结束位置。在每次迭代中,我们使用`*it`来访问当前迭代器指向的元素,将其赋值给`element`变量进行操作。 这样,我们就可以遍历QVector容器中的每个元素了。当然,你也可以使用其他迭代器函数,如`rbegin()`和`rend()`来逆序遍历容器。 需要注意的是,在遍历QVector容器时,要确保容器中已经有元素,否则容器为空时使用迭代器会导致未定义的行为。 ### 回答3: 遍历 QVector 容器可以通过不同的方法实现。下面是两种常用的方法: 1. 使用迭代器: 通过 QVector 的 begin() 和 end() 函数获取容器的开始和结束迭代器,然后利用循环遍历整个容器,如下所示: ``` QVector<int> numbers = {1, 2, 3, 4, 5}; for (QVector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) { int number = *it; // 对 number 进行处理 qDebug() << number; } ``` 在循环中,我们使用迭代器 it 来访问容器中的每个元素。通过 *it 可以获取当前迭代器位置的元素。 2. 使用范围循环: C++11 引入了范围循环(Range-based loop)语法,可以更简洁地遍历容器,如下所示: ``` QVector<int> numbers = {1, 2, 3, 4, 5}; for (int number : numbers) { // 对 number 进行处理 qDebug() << number; } ``` 在这个循环中,我们直接将容器 numbers 中的元素赋值给变量 number,无需使用迭代器。 无论使用迭代器还是范围循环,都可以遍历 QVector 容器并对其中的元素进行处理或输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值