C++使用旧编译器GCC 4.4.0在结构列表中查找字符串

C++ Find a string in struct list with old compiler GCC 4.4.0

本文关键字:列表 结构 查找 字符串 编译器 GCC C++      更新时间:2023-10-16

我正在开发一个程序,该程序有一个基于结构的列表,用于存储一些文件属性数据。

struct files {
string name;
string size;
string owner;
};

下面介绍了列表变量

list<files> myfilecollection;

我想做的事情是检查myfilecollection中是否包含一些确定的文件名。基本上,我检查了这个示例帖子,并尝试编写这个函数:

bool isFileSensible(const string& filename)
{
auto match = std::find_if(myfilecollection.cbegin(), myfilecollection.cend(), [name] (const files& s) {
return s.name == filename;
});
return match != myfilecollection.cend();
}

这个实现可以与GCC 9.2.0一起工作,但我需要使这个功能在GCC 4.4.4上工作,甚至不符合C++11。为GCC 4.4.0重新实现此功能的最佳方式是什么?

谨致问候,F.Borges

lambda只不过是编写函子的简短形式。您可以返回到编写一个行为与相同的函子

bool isFileSensible(const string& filename)
{
struct FindFilename
{
std::string filename;
FindFilename(std::string filename) : filename(filename) {}
bool operator()(const files& obj)
{
return obj.name == filename;
}
};
std::list<files>::const_iterator match = std::find_if(myfilecollection.cbegin(), myfilecollection.cend(), FindFilename(filename));
return match != myfilecollection.cend();
}

我已经将FindFilename放在函数的作用域中,这样它就不会污染全局命名空间。如果你想在其他地方重用这个函子,你可以把它移到全局范围。

您使用的是auto和lambda,它们都是C++11。幸运的是,在您的情况下,两者都可以简单地替换。

Lambdas基本上只是函子类的语法糖,因此您可以使用:

struct compare_files_by_name {
std::string target;
compare_files_by_name(const std::string& target) : target(target) {}
bool operator()(const files& f) {
return f.name == target;
}
};

find_if返回的是一个list<files>::const_iterator。如果我们把这些放在一起,你会得到:

bool isFileSensible(const string& filename)
{
compare_files_by_name comp(filename);
std::list<files>::const_iterator match = std::find_if(myfilecollection.cbegin(), myfilecollection.cend(),comp);
return match != myfilecollection.cend();
}

PS:由于习惯了auto,我觉得完全写出迭代器类型很奇怪。我可能会把它写成

return myfilecollection.cend() != std::find_if(....

只是为了避免拼写出迭代器类型。