我正在使用 std::mismatch 检查结构的两个 vector 是否完全相同。通常,在我的程序中没有,但是在特殊情况下可能会发生。在documentation中,我发现以下内容:



但是,如果我创建两个完全相等的 vector ,则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仍然为空。从文档中,我虽然会返回每个 vector 的最后一个值。当出现两个元素都匹配的序列时,我是否会误解不匹配的表现?

最佳答案

如果一切都匹配,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));
}

关于c++ - 等值 vector 的返回值std::mismatch,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42366262/

10-09 13:10