首页 > 解决方案 > 而不是这么多 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来做到这一点

问题描述

我有一个结构向量vector<S> sData,我的结构包含 5 个元素(姓名、年龄、技术、项目、语言)

用户可以输入名称,它应该输出与该名称和其他元素相同的结构。

我的问题是用户只能输入其中两个,它应该只检查那些像用户可以输入年龄和语言的人,它应该输出具有相同年龄和语言的人的列表。如果您想象您可以编写如此多的 if 语句,那么它将给出正确的输出,因为您有 5 个元素,并且用户可以选择其中的 5 个 4 并且他可以随机输入其中的 3 或 4 个,我的程序应该理解这个逻辑。

在我的代码中,我使用 Qt 小部件应用程序编写。当用户没有输入任何字符串(名称、技术、项目、费率)时,默认值为 NULL,年龄为 -1。

struct S
{
    QString name;
    int age;
    QString techs;
    QString projects;
    QString rate;

};

QVector<S> sData;
QVector<int> indexData;





//this is how i did for the name
 indexData.clear();
 if(searchName!=NULL)//i don't want to write this if for name and age ||
 // name and tech ... then age and tech etc.
 {
    for(int i=0;i<sData.count();++i)
    {
        if(searchName==sData[i].name)
        {   
         indexData.push_back(i);   
        }
    }
 }

标签: c++qttableviewviewmodel

解决方案


这有帮助吗?

struct S
{
    QString name;
    int age;
    QString techs;
    QString projects;
    QString rate;
};

QVector<S> sData;
QVector<int> indexData;

int main() {
    searchName = ...;
    searchAge = ...;
    searchTechs = ...;
    ...
    auto it = std::find_if(std::begin(sData), std::end(sData), 
            [&searchName, &searchAge, &searchTecs, ...](const S& s) 
    {
        bool eq = true;
        if (searchName)
            eq &= (searchName == s.name);
        if (searchAge)
            eq &= (searchAge == s.age);
        if (searchTechs)
            eq &= (searchTechs == s.techs);
        ....

        return eq;
    }
    if (it == std::end(sData))
        std::terminate(); //element not found   

    // *it is the desired element
}

或者如果你想找到每个匹配的元素

int i = 0;
for (const S& s : sData) {
    bool eq = true;
    if (searchName)
        eq &= (searchName == s.name);
    if (searchAge)
        eq &= (searchAge == s.age);
    if (searchTechs)
        eq &= (searchTechs == s.techs);
    ....

    if (eq)
        indexData.push_back(i);
    ++i;
}

推荐阅读