C++ 如何比较两个向量是否相等?

C++ 如何比较两个向量是否相等?,c++,algorithm,stl,C++,Algorithm,Stl,我有以下计划: std::vector<int> nums = {1, 2, 3, 4, 5}; std::vector<int> nums2 = {5, 4, 3, 2, 1}; bool equal = std::equal(nums.begin(), nums.end(), nums2.begin()); if (equal) { cout << "Both vectors are equal" << endl;

我有以下计划:

std::vector<int> nums = {1, 2, 3, 4, 5};
std::vector<int> nums2 = {5, 4, 3, 2, 1};

bool equal = std::equal(nums.begin(), nums.end(), nums2.begin());
if (equal)
{
    cout << "Both vectors are equal" << endl;
}
std::vector nums={1,2,3,4,5};
向量nums2={5,4,3,2,1};
bool equal=std::equal(nums.begin(),nums.end(),nums2.begin());
如果(相等)
{
CUT< P>你正在寻找一个或一个.C++标准库,这些数据结构的实现有:


您可以从每个向量构造一个
std::unordered_集
,然后比较它们,如下面的代码片段所示:

#包括
#包括
#包括
使用名称空间std;
int main()
{
std::vector nums={1,2,3,4,5};
向量nums2={5,4,3,2,1};
向量nums3={5,4,9,2,1};
无序集合s1(nums.begin(),nums.end());
std::无序_集s2(nums2.begin(),nums2.end());
无序集合s3(nums3.begin(),nums3.end());
如果(s1==s2){

STD::P.>如果我必须从头开始创建一个算法,因为不管使用集合或排序的原因是什么,我都会考虑删除匹配。这将是低效的-它是O(n ^ 2)-但是它会起作用,并且效率低下在很多情况下不太可能成为问题:

bool compare(A, B)
  copy B to BB
  for each a in A
    if BB contains a
      remove a from BB
    else
      return false

  if BB is empty
    return true

  return false
标准库算法完全满足您的要求。如果两个范围以任何顺序包含相同的元素,它将返回
true

对于某些应用程序来说,它可能很慢,但它只需要相等比较,不需要临时容器或额外的内存分配

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

int main()
{
    std::vector<int> nums = { 1, 2, 3, 4, 5 };
    std::vector<int> nums2 = { 5, 4, 3, 2, 1 };

    bool equal = std::is_permutation(nums.begin(), nums.end(), nums2.begin(), nums2.end());

    if (equal) {
        std::cout << "Both vectors are equal" << std::endl;
    }
}
#包括
#包括
#包括
int main()
{
std::vector nums={1,2,3,4,5};
向量nums2={5,4,3,2,1};
bool equal=std::is_置换(nums.begin(),nums.end(),nums2.begin(),nums2.end());
如果(相等){

std::cout用另一种方法来解决您的任务。如果向量有重复的元素(如下面的示例所示),它也可以正常工作。它也非常快,
O(N*Log(N))
平均时间,在现实生活中,将接近于std::无序集或std::无序集的解决方案

是的,我看到OP要求在没有排序的情况下实现,但实际上几乎可以肯定std::is_排列也在下面进行排序。std::set也使用树进行间接排序。甚至std::unordered_set也会根据哈希值进行排序(哈希bucketing是一种基数排序).因此,如果没有一种间接排序或其他形式的整向量排序,这个任务可能无法解决


对向量进行排序或使用
std::unordered_set
-这些选项是吗?是的,这可以工作,谢谢,但可能有一些stl算法用于此操作?如果存在重复元素,您会寻求什么结果。例如,
{1,2,3,4,4}
比较是否等于
{4,3,2,1}
根据您的标准?多亏了大家,这真的很有帮助。实际上算法是_permutation()这正是我想要的。在我的情况下,性能并不重要。为此,我必须重载大于自定义对象的运算符。这对我不起作用,因为我没有任何比较标准。有没有办法在不排序的情况下比较顺序对象?@Oleg Use
unordered\u set
unordered\u multiet
。他们需要你专门化
std::hash
和重载相等运算符。@Oleg vector确实不是合适的工具。这正是一个集合数据结构的域。特别是如果这些容器中有很多对象。谢谢,是的,这正是我需要的。你还需要一种散列自定义对象的方法。@AyxanHaqverdili Yes-正在处理它!…有一个不会删除重复项的方法。@Arty Yes-我看到了,但是链接的cppreference页面也注意到,
std::equal_to
对于
std::unordered_multiset
不可用;但是,有一个
操作符==
,但我不清楚它是如何工作的。谢谢,是的,我只是想要m这是一些stl算法的例子,但这正是我的想法。
std::is_permutation
不会修改数据,因此没有排序。这就是为什么它有O(n^2)最坏情况复杂性。这也是为什么我添加了速度警告,但它可以工作,而且几乎肯定“足够快”有很多用途。@blastfurny有趣的是它是如何完成它的任务的?据说它的复杂性从O(N^2)到O(N)不等。它有什么算法吗?标准是否限制不同的编译器在O(N^2)中实现它时间?我在标准中没有看到它应该如何实现。难道一些编译器不能在临时内存中进行排序吗?CPP参考有一个。你也可以看看主要的库实现,这是Micsrosoft的实现。我认为算法可以追溯到Alex Stepanov,有一些。如果你对t的设计感兴趣的话他的标准库算法大部分归功于Alexander Stepanov,他写了几本关于泛型编程的好书。
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> nums1 = {1, 2, 3, 4, 1, 5}, nums2 = {5, 4, 3, 1, 2, 1};
    std::sort(nums1.begin(), nums1.end());
    std::sort(nums2.begin(), nums2.end());
    std::cout << std::boolalpha << (nums1 == nums2) << std::endl;
}
true