对于相等向量,返回值std :: mismatch

时间:2017-02-21 11:38:20

标签: c++ c++11 stl

我正在使用std::mismatch来检查结构的两个向量是否完全相同。通常,在我的程序中,它们不是,但在特殊情况下可能会发生。在documentation我找到以下内容:

  

"如果两个序列中比较的元素都匹配,则该函数返回一对,第一个设置为last1,第二个设置为第二个序列中相同相对位置的元素。"

但是,如果我创建两个完全相等的向量,std :: mismatch不会返回值。我想要做的一个小例子:

#include <vector>
#include <algorithm>
#include <utility>

struct structwithnumber {
    int id;
};

bool compare_structs (structwithnumber* struct1, structwithnumber* struct2) {
    return struct1->id == struct2->id;
};

bool compare_structvectors(std::vector<structwithnumber*> v1, std::vector<structwithnumber*> v2) {
    if (v1.size() != v2.size())
    {
        return false;
    }
    std::pair<std::vector<structwithnumber*>::iterator, std::vector<structwithnumber*>::iterator> mypair;
    mypair = std::mismatch(v1.begin(), v1.end(), v2.begin(), compare_structs);
    return (compare_structs(*mypair.first, *mypair.second));
}

void simple_example() {
    structwithnumber* struct1 = new structwithnumber();
    structwithnumber* struct2 = new structwithnumber();
    struct1->id = 1;
    struct2->id = 2;
    std::vector<structwithnumber*> v1;
    std::vector<structwithnumber*> v2;
    v1.push_back(struct1);
    v1.push_back(struct2);
    v2.push_back(struct1);
    v2.push_back(struct2);
    compare_structvectors(v1, v2);
}

当我在visual studio 15中运行此代码时,我收到错误:

 return (compare_structs(*mypair.first, *mypair.second));

经过进一步调查后发现,错配后mypair仍为空。从文档中,我会返回每个向量的最后一个值。当我看到所有元素匹配的2个序列时,我是否误解了不匹配的表现?

2 个答案:

答案 0 :(得分:3)

std::mismatch,如果一切都匹配,则返回一个(至少一个)过去的迭代器。您不能像compare_structs(*mypair.first, *mypair.second)中那样取消引用它。

代码应按如下方式测试案例:

mypair = std::mismatch(v1.begin(), v1.end(), v2.begin(), compare_structs);

if(mypair.first == v1.end()) {
    // No mismatch, do something sensible
} else {
    return (compare_structs(*mypair.first, *mypair.second));
}

答案 1 :(得分:0)

  

但是,如果我创建两个完全相等的向量,std :: mismatch不会返回值

当然,它必须返回某些东西

  

经过进一步调查后发现,错配后,mypair仍然是空的。

这是什么意思? mypair如何为空?它是一对,在创建时只有两个成员,在调用mismatch之后它仍然只有两个成员。

然而,当两个序列匹配时,它是一对end迭代器。 这就像是说你有一对空的不匹配序列(它仍然不是一个不可能的空对)。

您无法取消引用这些迭代器,因此您的代码会被破坏。您需要在解除引用之前进行测试:

const bool v1_mismatch = (mypair.first != v1.end());
const bool v2_mismatch = (mypair.second != v2.end());
const bool identical = !(v1_mismatch || v2_mismatch);

if (v1_mismatch && v2_mismatch) {
    // this is the only case where you can dereference both
    return compare_structs(*mypair.first, *mypair.second);
}
// otherwise you can dereference at most one iterator,
// and if v1,v2 are identical, you can't dereference either