如何在c ++ 98中通过特定字段查找QList中的对象?

时间:2017-08-13 07:51:59

标签: c++ qt find qt-creator qlist

我有这个简单的课程:

class SomeClass
{
   QString key;
   QString someData;
   int otherField;
   public:
      QString getKey() { return key };
};

我有这个清单:

QList<SomeClass*> myList;

我想检查myList是否包含key =“mykey1”的对象;

for(int i = 0; i < myList.size(); i++)
{
  if(myList.at(i)->getKey() == "mykey1") 
  { 
      //do something with object, that has index = i
  }
}

是否有任何标准函数,它会循环并返回此对象或索引或指针? ,所以我不需要使用循环

3 个答案:

答案 0 :(得分:3)

您可以使用std::find algorithem。

您需要为operator==

重载std::find
class SomeClass
{
     //Your class members...

public: 
    bool operator==(const SomeClass& lhs, const SomeClass& rhs)
    {
      return lhs.key == rhs.key;
    }
}

然后找到你的主要用途:

if (std::find(myList.begin(), myList.end(), "mykey1") != myList.end())
{
   // find your key
}

答案 1 :(得分:1)

如果需要指向元素的指针,可以使用std :: find_if:

#include <QCoreApplication>
#include <functional>
#include <QDebug>
#include <QString>

class SomeClass
{
    public:
        QString key;
        QString someData;
        int otherField;
        SomeClass(QString key, QString someData, int otherField)
        {
            this->key = key;
            this->someData = someData;
            this->otherField = otherField;
        }
        QString getKey() { return key; }
};


void print(QList<SomeClass*>& list)
{
    for(auto* someclass : list) {
        qDebug() << someclass->key << someclass->someData << someclass->otherField;
    }
    qDebug() << "";
}

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // create list
    QList<SomeClass*> list {
        new SomeClass("first",  "first_data", 100),
        new SomeClass("mykey1", "second_data", 100)
    };

    // print
    print(list);

    // search for element and if found change data
    auto itr = std::find_if(list.begin(), list.end(), [](SomeClass* someclass) { return someclass->getKey() == "mykey1"; });
    if(itr != list.end()) {
        (*itr)->someData = "NEW";
    }

    // print
    print(list);

    return app.exec();
}

打印:

"first" "first_data" 100
"mykey1" "second_data" 100

"first" "first_data" 100
"mykey1" "NEW" 100

答案 2 :(得分:0)

QList类是一个提供列表的模板类。

您可以使用函数indexOf(),它返回列表中第一个值出现的索引位置,从索引位置向前搜索。如果没有匹配项,则返回-1。

#include <QList>

  QList<QString> list;
  int i = list.indexOf("Jane");
  if (i != -1)
      qDebug() << "First occurrence of Jane is at position " << i ;