如何通过C++ 98中的特定字段在QList中查找对象?
我有这个简单的类:如何通过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
}
}
是否有任何标准函数,会做循环并返回这个对象或索引或指针? ,所以我不需要使用循环
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 ;
嘿,谢谢你的回答,但我在QT中使用QList,我应该将QList转换为某种东西吗? – Dasd
你的意思是'QList'。仔细阅读OP的问题。并且像你所建议的那样盲目地使用'std :: find'将不起作用。一个自定义的coparator是必需的。 – StoryTeller
@Dasd - 无需转换。 'QList'遵循标准库期望的标准迭代器协议。 – StoryTeller
您可以使用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
}
如果你需要一个指针,你可以使用该元素的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
看到https://*.com/questions/24206033/qt-find-object-in-list-by-property –
为什么不写你自己的功能,以便你不必手动“循环”每一次? – dtech