检查两个向量是否相等。

53

如何检查两个向量的前“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;
}
为什么它打印“failure”,而不是“success”?
3个回答

150

使用 <algorithm> 头文件中的 std::equal 函数:

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

请注意,这两个向量必须至少有n个元素。如果其中一个太短,则程序的行为将是未定义的。

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

if (v1 == v2)

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


27
我不知道你可以使用==比较向量,还挺酷的! +1 - Marlon

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/


1
然而 v1==v2 更简单。 - Antony Hatchkins
@stephanmg:这是一个很大的主题,在有限的评论或两个评论中很难回答得好,所以最好作为单独的问题提出(如果您找不到现有的问答涵盖您想要的内容)。总的来说:如果从相同的数字以不同的方式计算两个float/ double(例如a / b * c vs a * c / b,或者a + b + c vs a + c + b),它们可能不完全相等; 但是一旦您获得了float/ double值,它可以正常地复制并在无任何修改的情况下比较其早期值。但是细节还要更加微妙。干杯 - Tony Delroy
1
@stephanmg: fabs(...) 返回参数的绝对值(即任何负数都变成正数)- 这不是您通常比较数字时想要的,但有很多问题可能会有意义。它无法解决微妙的舍入误差,这就是我认为您在询问的大问题 - 它们是浮点比较的主要问题。 - Tony Delroy
@TonyDelroy:哦,是的,我误解了问题。抱歉。我同意浮点数比较存在的问题。 - stephanmg

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))不同。此外,如果您的范围更复杂(例如类的向量),您应该考虑使用投影功能(如果您想在比较之前应用函数,或者比较给定的成员变量等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接