检查两个向量是否相等

问题描述 投票:0回答:4

如何检查两个向量的前“n”个元素是否相等?

我尝试了以下方法:

#include <iostream>
#include <vector>
#include <iterator>
using namespace std;

typedef vector<double> v_t;

int main(){
    v_t v1,v2;
    int n = 9;

    for (int i = 1; i<10; i++){
        v1.push_back(i);
        v2.push_back(i);
    }
    v1.push_back(11);
    v2.push_back(12);

    if (v1.begin()+n == v2.begin()+n)
        cout << "success" << endl;
    else
        cout << "failure" << endl;
}

为什么打印“失败”而不是“成功”?

c++ vector set
4个回答
150
投票

使用 std::equal

 标题中的 
<algorithm>
 函数:

if (std::equal(v1.begin(), v1.begin() + n, v2.begin()))
  std::cout << "success" << std::endl;

请注意,两个向量中必须至少有

n
个元素。如果其中任何一个太短,程序的行为将是不确定的。

如果你想检查整个向量是否等于另一个,只需像比较其他任何东西一样比较它们:

if (v1 == v2)

您的(失败的)代码正在将一个向量的 iterator 与另一个向量的 iterator 进行比较。相等向量的迭代器不相等。每个迭代器都与其迭代的序列相关联,因此一个向量的迭代器永远不会等于另一个向量的迭代器。


6
投票

比较两者的最简单(就查找的非日常函数最少而言)的方法是再次循环:

bool are_equal = true;
for (int i = 0; i < first_how_many; i++)
    if (v1[i] != v2[i])
    {
        are_equal = false;
        break;
    }

它会做同样的事情,但如果您愿意,可以使用

<algorithm>
标头的
std::equal
函数:http://www.cplusplus.com/reference/algorithm/equal/


0
投票

首先,不需要跟踪向量的大小,即

n
没有用;
begin(v) + n == end(v)
或只是
n == size(v)
(大小信息位于向量类中)。

现在,我只想指出一个 C++20 功能,即范围库。它简化了许多标准算法的函数签名,例如当前解决问题的“最佳”方法是:

std::ranges::equals(v1, v2); // returns a bool

而不是之前的

std::equals(begin(v1), end(v1), begin(v2))
。另外,如果您的范围更复杂(即类的向量),您应该考虑投影功能(如果您想在比较之前应用函数,或者比较给定的成员变量等)。


0
投票

尝试使用运算符 ==() 来比较向量时要小心。 我在各个论坛上阅读了有关此主题的多个答案,但似乎没有人提到这仅适用于本机类型,如下面的示例所示:

std::vector<int> v1{ 1, 3, 5, 7 }; // create a vector with 4 elements
std::vector<int> v2{ 1, 3, 5, 7 }; // let's make this vector the same

// now compare:
if (v1 == v2) {
    std::cout << "SUCCESS!!!" << std::endl;
}

是的,上面的代码可以工作! (我刚刚尝试过。:)

但是,如果不付出很大的努力,下面的代码将无法工作:

class Foo {
public:
    int m_num = { 7 };
    Foo(int n=0) : m_num(n) {}
};

// Create our comparison vectors filled with Objects of type Foo:
std::vector<Foo> foo1{ 1, 3, 5, 7 };
std::vector<Foo> foo2{ 1, 3, 5, 7 };

// This will not compile:
if (foo1 == foo2) {
    std::cout << "SUCCESS!!!" << std::endl;
}

经过一番苦恼后,我确实找到了一种相对轻松的方法来进行上述比较,但是:

// First create a predicate function to perform the equivalency test:
bool match(Foo& f1, Foo& f2)
{
    return f1.m_num == f2.m_num;
}

// Then use std::equal() like so:
if (std::equal(foo1.begin(), foo1.end(), foo2.begin(), foo2.end(),match)) 
{
    std::cout << "### VECTORS MATCH!!! ###" << std::endl;
}

希望这可以帮助某人避免我刚刚经历过的同样的烦恼,试图找出如何使这项工作成功。

© www.soinside.com 2019 - 2024. All rights reserved.