是否有标准算法来检查容器 A 是否是容器 B 的超集?

Is there a standard algorithm to check if container A is a superset of container B?

我一直在寻找一种标准算法,给定两个容器 A 和 B,两者都没有重复项,如果 A 的所有元素与 B 的一个元素比较为真,则 returns 为真。我使用 std::all_of 带有一个谓词来检查另一个容器中的成员资格,但我想知道是否有更优雅的解决方案..

Is there a STL algorithm to check if two containers contain same elements?

我想你的意思是“比较相等的元素”。一个 object 只能是一个容器的元素(至少在所有标准容器的情况下)。

i was looking for an std:: algorithm that given two containers A and B, returns true if all the elements of A are contained in B.

此题与标题题不同

对于第一个,有std::is_permutation。但是,对于某些容器类型,有更高效的算法。例如,如果容器是排序的(如std::set),那么你可以简单地比较是否相等。

对于第二个,没有通用算法。如果容器已排序,则可以使用 std::includes。否则你可以写一个先排序的算法,然后使用 std::includes.

I used std::all_of with a predicate that checks membership in the other container

如果较大的容器具有快速查找(如无序集),那么这个解决方案很好。

std::includes 如果两个容器都已排序,则这样做。

#include <algorithm>
#include <vector>
#include <iostream>

int main() {

  std::vector< int > A = {1, 2, 3, 4, 7};
  std::vector< int > B = { 1, 2 ,3};
  std::vector< int > C = { 3, 4, 5};

  bool BinA = std::includes(A.begin(), A.end(), B.begin(), B.end());
  bool CinA = std::includes(A.begin(), A.end(), C.begin(), C.end());
  std::cout<< "B in A = " << BinA <<std::endl;
  std::cout<< "C in A = " << CinA <<std::endl;
}

https://godbolt.org/z/dnoM4xPbY

如果您没有对它们进行排序,并且您t/don不想对它们进行排序,那么我相信 all_of 方法是尽可能高效的。 如果性能很重要,我认为首先排序更有效,但你应该检查你的具体情况。