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