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

时间:2014-01-10 22:13:31

标签: c++ vector struct

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

结构代码如下:

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

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

我可以使用C ++ 11。

2 个答案:

答案 0 :(得分:1)

根据二元谓词为PackageInfo类提供strict weak ordering谓词,或者只提供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现在是PackageInfoinstalled_pacakges中存在的required_packages集合。然后,您可以验证是否所有必需的required_packages都可用。

答案 1 :(得分:0)

您可以使用cpplinq。当然,从单个操作中使用它是没有意义的,但是如果你可以将它用于更多的东西,那么将cpplinq.h标题添加到你的项目中,这就是你的工作方式

std::vector<PackageInfo> installed_packages;
std::vector<PackageInfo> required_packages;

auto diff = from(installed_packages) 
         >> except(from(required_packages)) 
         >> to_vector();