我有这个简单的课程:
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
}
}
是否有任何标准函数,它会循环并返回此对象或索引或指针? ,所以我不需要使用循环
答案 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 ;