比较同一结构的两个不同大小的向量

Compare two different size vectors of the same struct

本文关键字:两个 向量 结构 比较      更新时间:2023-10-16

我正在开发一个超小型的包管理器,用于自定义目的,带有一个简单的依赖项检查器,为此我需要比较两个向量(但数据类型相同,结构)第一个向量具有用户安装的包(使用简单的SQLite查询),第二个向量是安装所需的包。

结构代码如下所示:

typedef struct {
  std::string UniformTypeID;
  std::string PackageName;
  unsigned int Version; 
} PackageInfo;

我需要知道如何比较这两个向量,但这里有一个问题,两个向量的大小可能会有所不同,例如,如果我使用已安装的包的大小矢量小于依赖包(更大),找不到任何包在其限制,但请求的包超出了它们的限制。

我可以使用C++11。

PackageInfo类提供严格的弱排序谓词,无论是二进制谓词还是简单地提供operator<

有了它,您可以对阵列(已安装的软件包和所需的软件包)进行排序。 然后你可以使用STL的集合操作函数:

std::vector<PackageInfo> installed_packages = ...;
std::vector<PackageInfo> required_packages = ...;
std::vector<PackageInfo> met_requirements;
std::sort(installed_packages.begin(), installed_packages.end());
std::sort(required_packages.begin(), required_packages.end());
std::set_intersection(
   installed_packages.begin(), installed_packages.end(),
   required_packages.begin(), installed_packages.end(),
   std::back_inserter(met_requirements));

met_requirements现在是installed_pacakgesrequired_packages中都存在的一组PackageInfo。 然后,您可以验证所有必要的required_packages是否可用。

你可以

使用 cpplinq。当然,从单个操作中使用它没有意义,但是如果您可以将它用于更多事情,则将cpplinq.h标头添加到您的项目中,这是您如何做到的

std::vector<PackageInfo> installed_packages;
std::vector<PackageInfo> required_packages;
auto diff = from(installed_packages) 
         >> except(from(required_packages)) 
         >> to_vector();