而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成

instead of so many if statements I want a logic where I can do it with one statement or optimized way

本文关键字:一个 语句 我可以 优化 方式 我想要 if      更新时间:2023-10-16

我有一个结构向量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);   
}
}
}

我建议进行一些代码重构。让我们考虑添加一个辅助结构 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);
}
};

这允许您迭代数据向量并筛选结果。 我认为最干净的方法是使用 ranges-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 ...
}

这有帮助吗?

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