而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
instead of so many if statements I want a logic where I can do it with one statement or optimized way
我有一个结构向量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;
}
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- C++ typedef 函数指针,并在一个语句中声明一个指针
- 一个语句中没有多个 cout 的错误/警告
- 案例语句不会前进到下一个语句
- 是否可以在一个语句中创建对象并调用方法?
- 如何在C 中循环一个语句
- 从一个 if 语句转到另一个语句
- 在一个语句中对原子布尔变量进行多次赋值
- 是否可以在一个语句中执行2个相反的位置操作
- 在尝试块中的一个语句中是否有例外情况导致控制流程绕过try块中的所有剩余语句
- 是 for() 循环维护在堆栈内部或 for 只是一个语句
- 如何在一个语句中定义对数组的引用
- C++ 中一个语句中的多个 printf
- C++:在最后一个语句之前调用析构函数的时间
- 将 3 个C++语句合并为一个语句
- 在输入一个语句块时会创建一个新的堆栈帧吗
- if语句下只有一个语句正在运行
- 我可以通过一个语句初始化一个类的对象吗