【问题标题】:Qt C++ How to use QList< >::const_iterator?Qt C++如何使用QList< >::const_iterator?
【发布时间】:2013-09-30 03:41:55
【问题描述】:

我正在遍历一个列表,我想使用 const_iterator。但我不知道该怎么做!到目前为止,我使用迭代器并以这种方式实现了我的功能。谁能帮我使用 const_iterator?

void MainWindow::populate(const QList<Vehicle> &vehicles)
{
int j = 0;
QListIterator<Vehicle> iter(vehicles);    
while(iter.hasNext()){
    Vehicle car = iter.next();
    //set car
    QString makeAndModel = car.getGeneralData().getMake() + car.getGeneralData().getModel();
    QStandardItem *mAndM = new QStandardItem(QString(makeAndModel));
    mAndM->setEditable(false);
    model->setItem(j,0,mAndM);

    //set type
    QStandardItem *type = new QStandardItem(QString(car.getGeneralData().getType()));
    type->setEditable(false);
    model->setItem(j,1,type);

    //set mileage
    QString mileageString = QString::number(car.getGeneralData().getMileage());
    QStandardItem *mileage = new QStandardItem(QString(mileageString));
    mileage->setEditable(false);
    model->setItem(j,2,mileage);

    //set year
    QString yearString = QString::number(car.getGeneralData().getYear());
    QStandardItem *year = new QStandardItem(QString(yearString));
    year->setEditable(false);
    model->setItem(j,3,year);

    //set registration
    QString regString = VehicleHelper::convertBoolToString(car.getRegistration().isRegistered());
    QStandardItem *regDate = new QStandardItem(QString(regString));
    regDate->setEditable(false);
    model->setItem(j,4,regDate);
    j++;
   }
 }

【问题讨论】:

    标签: c++ qt list iterator


    【解决方案1】:

    用于迭代 QList 的其他一些变体:

    使用 ConstIterator/const_iterator:

    QList<Vehicle>::ConstIterator it = vehicles.constBegin();
    
    for ( ; it != vehicles.constEnd(); ++it ) {
        const Vehicle& vehicle = *it;
        ...
    }
    

    Q_FOREACH(相当于foreach):

    Q_FOREACH (const Vehicle& vehicle, vehicles) {
        ...
    }
    

    或者使用 STL pre-C++11 的方式:

    std::for_each(vehicles.begin(), vehicles.end(), SomeFunction())
    

    其中 SomeFunction 是以 Vehicle 作为参数的一元函数或函子。

    如果您可以使用 C++11 功能(取决于您要支持的编译器),您可以使用基于范围的 for 循环:

    for ( auto vehicle : vehicles ) {
        ...
    }
    

    【讨论】:

    • 我认为使用“auto”最好写“auto &”以避免不必要的对象副本。
    • @FrankBuss 为真,当vehicles 不是 const 时可能为 qAsConst()。对于只读访问,我会写 for (const auto &amp;vehicle : qAsConst(vehicles)) 然后。
    【解决方案2】:

    QList 提供 STL 风格的迭代器和 Java 风格的迭代器。 QList::const_iterator 类为QListQQueue 提供了一个STL 风格的常量迭代器。默认的QList::const_iterator 构造函数会创建一个未初始化的迭代器。在开始迭代之前,您必须使用 QList 函数(如 QList::constBegin()QList::constEnd()QList::insert())对其进行初始化。

         QList<Vehicle>::const_iterator iter;
         for (iter = vehicles.constBegin(); iter != vehicles.constEnd(); ++iter) {
               const Vehicle& vehicle = *iter;
               //...
         }
    

    【讨论】:

      【解决方案3】:

      或类似 STL:

      for(QList<Vehicle>::const_iterator it(list.begin());it!=list.end();++it)
      {
          const Vehicle v(*it);
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-16
        • 2012-12-06
        • 1970-01-01
        • 2013-03-17
        • 2012-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多