而不是那么多的if语句,我想要一种可以用一条语句或优化方式做到的逻辑

问题描述 投票:-1回答:2

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

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

我的问题是用户只能输入两个,并且应该只检查那些可以输入年龄和语言的用户,它应该输出具有相同年龄和语言的人的列表。如果您想象可以编写许多if语句,那么由于您有5个元素,因此它会给出正确的输出,并且用户可以从5个中选择5个,然后随机输入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++ qt tableview viewmodel
2个回答
0
投票
有帮助吗?

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; }


0
投票
我建议进行一些代码重构。让我们考虑添加一个辅助结构SearchS,其中包含您要查找的所有参数(以及比较运算符):

struct S { QString name; int age = -1; QString techs; QString projects; QString rate; }; struct SearchS { std::optional<QString> name; std::optional<int> age; std::optional<QString> techs; std::optional<QString> projects; std::optional<QString> rate; static bool string_match(const QString& s, const std::optional<QString>& search_s) { return !search_s || *search_s == s; } bool operator==(const S& s) const noexcept { return string_match(s.name, name) && string_match(s.techs, techs) && string_match(s.projects, projects) && string_match(s.rate, rate) && (!age || *age == s.age); } };

这可以让您遍历数据向量并过滤结果。我认为最干净的方法是使用range-v3:

std::vector<S> sData; SearchS target; target.name = "John"; target.age = 28; // ... other params if needed ... auto filtered_items = data | ranges::views::filter([&target](const auto& item) { return target == item; });

这里您可以应用其他过滤器...或遍历过滤的结果:

for(auto&& item : filtered_items) { // ... add your code here ... }

© www.soinside.com 2019 - 2024. All rights reserved.