2017-08-13 78 views
2

我有这个简单的类:如何通过C++ 98中的特定字段在QList中查找对象?

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

我有这个名单:

QList<SomeClass*> myList; 

我要检查,如果myList中包含键= “mykey1” 对象;

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

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

+0

看到https://stackoverflow.com/questions/24206033/qt-find-object-in-list-by-property –

+0

为什么不写你自己的功能,以便你不必手动“循环”每一次? – dtech

回答

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 ; 
+0

嘿,谢谢你的回答,但我在QT中使用QList,我应该将QList转换为某种东西吗? – Dasd

+0

你的意思是'QList'。仔细阅读OP的问题。并且像你所建议的那样盲目地使用'std :: find'将不起作用。一个自定义的coparator是必需的。 – StoryTeller

+0

@Dasd - 无需转换。 'QList'遵循标准库期望的标准迭代器协议。 – StoryTeller

0

您可以使用std::find算法。

你需要重载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 
} 
0

如果你需要一个指针,你可以使用该元素的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 
+0

它不适用于C++ 98,Prior C++ 11标准没有lambda语法的概念。 – Simon

+0

是的,你是对的,它只是在C++ 11及以上工作,该死的我完全忽略了问题中的C++ 98语法限制... – Spiek

相关问题