gpt4 book ai didi

c++ - 如何比较两个 vector 的相等性?

转载 作者:行者123 更新时间:2023-12-04 12:23:03 25 4
gpt4 key购买 nike

我有以下程序:

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;
}
有两个元素相等的 vector 。 std::equal 函数在这里不起作用,因为它按顺序执行并比较相应的元素。有没有办法检查这两个 vector 是否相等并且在我的情况下不进行排序就为真?在实际示例中,我没有整数,而是自定义对象,它们比较为指针的相等性。

最佳答案

您可以构建一个 std::unordered_set从每个 vector 中,然后比较它们,如下面的代码片段所示:

#include <iostream>  
#include <vector>
#include <unordered_set>

using namespace std;

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

std::unordered_set<int> s1(nums.begin(), nums.end());
std::unordered_set<int> s2(nums2.begin(), nums2.end());
std::unordered_set<int> s3(nums3.begin(), nums3.end());

if (s1 == s2) {
std::cout << "1 and 2 are equal";
}
else {
std::cout << "1 and 2 are different";
}
std::cout << std::endl;

if (s1 == s3) {
std::cout << "1 and 3 are equal";
}
else {
std::cout << "1 and 3 are different";
}
std::cout << std::endl;

return 0;
}
但是,有几点需要牢记:
  • 对于自定义类型对象的 vector ,您需要提供 operator==对于那种类型(但无论如何都必须这样做,或者你怎么能说两个 vector 是否具有相同的内容)。
  • 包含重复项的 vector 将创建删除这些重复项的集合:因此,{1, 2, 2, 3}将显示等于 {1, 2, 3} .
  • 您还需要提供 std:hash为您的自定义类型。对于一个琐碎的类,bob ,它只是包装一个整数,那个散列,以及所需的 operator== , 可以定义如下;然后您可以更换 <int>上面例子中的特化 <bob>它会起作用。 (此 cppreference article 解释了有关哈希的更多信息。)

  • class bob {
    public:
    int data;
    bob(int arg) : data{ arg } { }
    };
    bool operator==(const bob& lhs, const bob& rhs)
    {
    return lhs.data == rhs.data;
    }
    template<> struct std::hash<bob> {
    std::size_t operator()(bob const& b) const noexcept {
    return static_cast<size_t>(b.data);
    }
    };

    关于c++ - 如何比较两个 vector 的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66301850/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com