如何比较C++中不同大小的向量

How to compare vectors of different sizes in C++

本文关键字:向量 C++ 何比较 比较      更新时间:2023-10-16

我有两个向量,一个包含有关系列的信息(ID,名称,流派和季节数量(,另一个包含不同系列的剧集(ID,IDofEpisode,名称,持续时间,评级,季节(。第一个向量仅包含大约 4 个系列(其所有信息都在向量内(,第二个向量包含所有 4 个系列的 50 多集(其所有信息也在向量内(。如果两个向量的 ID 放在一起,则它们的 ID 具有相同的数字,例如:

series(20110125, "Game of Thrones", "Drama", 8);

series(20170120, "Dark", "Mystery" ,2);

episodes(20110125, "20110125-S01E01", "Winter is coming", "1:02", 9.1 ,1);

episodes(20170120, "20170120-S02E01", "Beginnings and Endings", "0:53", 8.9, 2);等等

我需要做的是能够通过它们的 ID 号比较两个向量,我的问题是考虑到大小差异,我不确定该怎么做。如果有任何帮助,这些向量来自不同的类别(系列和剧集(。

如何比较C++中不同大小的向量

我猜你想具体比较同一类型std::vector的两个实例。因此,对于一些定义良好且有序的抽象数据类型τ,两个std::vector< >(它应该是LessThanComparable(。

std::vector<int>std::vector<std::string>进行比较没有普遍意义(您需要在纸上指定您想要的内容(。

您首先需要在纸上指定您的比较操作。它应该定义一些偏序吗?也许你想要一些字典顺序,并且你的向量分量的类型是可比的?

在这种情况下,请考虑使用std::lexicographical_compare

有关C++的更多信息,请参阅此处。也许阅读 C++11 标准 n3337。

另一种方法是确保某些超类的每个实例都有一个唯一的标识符(例如序列号 - 或它们的 std::tuple,或者您的类具有实现顺序的operator <- 可能存储在某个数据库中(,然后您将通过对象的唯一 id 比较对象。

您还可以通过地址比较某些class-es 的实例(例如使用std::addressof(。但是,由于ASLR,程序在许多操作系统上的行为变得不可重现(严格意义上,这样做可能是未定义的行为;在大多数情况下,它在实践中确实有效(。

也许更好或更合适的容器可以满足您的需求。如果您经常比较已知是完全有序的数千个整数的许多不同序列,则可以考虑用某种std::set<int>来表示每个这样的升序序列,并且比较这样的 std::set-s 可能会更便宜。扬子晚报.

您绝对应该考虑编写自己的GCC插件,以在编译时优化比较和/或使用元编程技术生成比较它们的C++代码。因此,像SWIG一样生成无聊的C++代码。然后阅读J.Pitrat的书《人造生物:有意识的机器的良心》ISBN 978-1848211018

由于您将仅通过其ID来比较两个集合,因此大小差异应该不是问题。您可以只访问将成为 ID 的第一个元素,并基于此比较两个集合。