Qt:foreach


0、說明

Qt提供一個關鍵字foreach(實際上是<QtGlobal>中定義的一個宏)用於方便地訪問容器中的所有數據項。

foreach關鍵字用於遍歷容器中的所有數據項

注意

foreachRead-Only迭代器,不能用它去修改容器中的值。

1、用法

1.1、常用

foreach (variable , container)

使用foreach代碼比使用迭代器更簡潔。

例如,使用foreach遍歷一個QLinkedList<QString>的實例代碼如下:

QLinkedList<QString> list;
...
QString str;
foreach (str,list)
    qDebug() << str;

 1.2、臨時變量在foreach中定義

如果迭代遍歷在foreach中定義,需要寫成這種形式:

foreach( const QString &str , list )

此外,在foreach語句中也可以使用花括號,並用break退出迭代:

QLinkedList<QString> list;
...
foreach(const QString &str ,list){
    if(str.isEmpty())
        break;
    qDebug() << str;
}

1.3、在QMap上使用foreach

而對於QMapQHashforeach會自動訪問Key-Value中的Value,所以無需調用values()。如果要訪問Key則可以調用keys(),示例代碼如下:

QMap<QString , int> map;
...
foreach(const QString & str , map.keys())
    qDebug() << str <<':'<<map.value(str);

1.4、嵌套的foreach

對於多值映射,可以以使用兩重foreach語句,示例代碼如下:

QMultiMap<QString , int>map
...
foreach(const QString & str , map.uniqueKeys()){
    foreach(int i, map.values(str))
        qDebug()<<str<<':'<<i;
}

注意,foreach遍歷一個容器變量是創建了容器的副本,所以不能修改原容器變量的數據項。

 總結

  • foreach是一種簡便的用於迭代容器的方式;
  • 用法類似於Java中的foreach語法:
    foreach(variable , container)

    使用時的三種寫法:

    QLink<QString> list;
    ...
    
    //
    QString str;
    foreach(str,list)
        qDebug() << str;
    
    //
    foreach( const QString & str , list ){
        if(str.isEmpty())
            break;
        qDebug() << str;
    }
    
    //
    foreach ( QString str , list ){
        qDebug() << str;
    }
  • 用foreach訪問關聯類容器如QMap和QHash時,默認訪問Value,如果想訪問Key,可以把foreach的第二項改為調用keys()函數:
    //默認訪問Value
    QMap <QString , int> map;
    ...
    foreach( const int & n , map)
        qDebug()<<n;
    
    //如果想訪問Key
    ...
    foreach(const QString & str , map.keys())
        qDebug()<<str<<':'<<map.values(str);

    對於多值映射,需要用兩重foreach

    QMultiMap<QString,int> map;
    ...
    foreach(QString str , map.uniqueKeys())
        foreach(int i , map.values(str))
            qDebug()<< str << ':' << i;
  • 不能通過foreach修改數據項,它是只讀迭代器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM