【问题标题】:Compare two different size vectors of the same struct比较同一结构的两个不同大小的向量
【发布时间】:2014-01-30 01:56:44
【问题描述】:

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

结构体代码如下:

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

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

我可以使用 C++11。

【问题讨论】:

  • 您期望得到什么结果?指示它们是否相等的布尔值?差异向量?相同元素的向量?什么?
  • 您应该定义一个标准,如何比较 cectors 的两个元素。为结构或运算符 <.> 定义运算符 == 就足够了
  • @MariusBancila Ups 抱歉,一个缺少依赖项的向量,我的意思是在已安装的包向量中找不到这些项目,我知道忘记了一些东西。

标签: c++ vector struct


【解决方案1】:

为您的PackageInfo 类提供一个strict weak ordering 谓词,可以是二元谓词,也可以只是提供一个operator&lt;

您可以通过它对数组(已安装的包和所需的包)进行排序。然后就可以使用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 现在是PackageInfo 的集合,同时存在于installed_pacakgesrequired_packages 中。然后,您可以验证是否所有必要的required_packages 都可用。

【讨论】:

  • 还有set_difference,这可能是提问者想要的:我不确定应该如何比较这两个向量,但set_difference 告诉你未安装所需的包(或者,如果您愿意,不需要的已安装软件包),而不是 已安装 已安装的必需软件包。
  • 我最初想到的是set_difference,但是,我可以设想有500“已安装”包和3“必需”包的情况。那么差异可以是 497 到 500 之间的任何数字。虽然我承认,但我正在对原始问题做出一些假设。
  • 确实,这完全取决于提问者想要做什么。如果想法是下载未安装的所需软件包,则以一种方式计算差异。如果想法是垃圾收集不需要的已安装包,则以另一种方式计算差异。如果想法是列出或版本检查已满足的要求,则计算交集。你甚至可以按照合适的顺序完成这三个 :-)
  • 工作了,谢谢你,我可以自己承担。
【解决方案2】:

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

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

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

【讨论】:

  • 看起来很有趣,我试试看。
猜你喜欢
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多