2011-03-08 129 views
40

如何检查两个向量的第一个“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; 
} 

为什么会打印出 “故障”,而不是 “成功”?

回答

118

<algorithm>头使用std::equal功能:

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

注意两个向量必须在他们至少n元素。如果其中一个太短,你的程序的行为将不确定。

如果你想检查整个矢量是否等于其他的,只是比较他们像你比较别的:

if (v1 == v2) 

你的(失败)的代码被比较的迭代一个向量的另一个迭代器。等向量的迭代器不相等。每个迭代器都与它正在迭代的序列相关联,所以一个向量的迭代器永远不会与另一个迭代器的迭代器相等。

+19

我不知道你可以使用'=='比较载体,我猜很酷! +1 – Marlon 2011-03-08 04:26:46

+0

是的,你是对的 – Inverse 2011-03-08 08:03:33

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/