如何比较std :: vectors与自定义对象

时间:2016-02-07 23:29:56

标签: c++ c++11 boost vector stl

我有2个向量,其中包含我在单元测试中使用的自定义对象。我无法更改向量中包含的对象的实现,并且对象不包含==重载。

我想比较这些向量中的每个对象,以确定它们在单元测试结束时是否在其中一个成员变量中具有相同的值。

目前我正在对矢量进行排序,然后像这样循环遍历内容:

// Sort predicate
bool SortHelper(MyObject& w1, const MyObject& w2)
{
    return (w1.MyInt() < w2.MyInt());
};

... 

//Ensure the sent and received vecs are the same length
ASSERT_EQ(vectorOne.size(), vectorTwo.size());

// Sort the vectors
std::sort(std::begin(vectorOne), std::end(vectorOne), SortHelper);
std::sort(std::begin(vectorTwo), std::end(vectorTwo), SortHelper);

// Ensure that for each value in vectorOne there is a value for vector2
auto v1Start = std::begin(vectorOne);
auto v1End = std::end(vectorOne);
auto v2Start = std::begin(vectorTwo);
auto v2End = std::end(vectorTwo);

if ((v1Start != v1End) && (v2Start != v2End))
{

    while (v1Start != v1End) {
        EXPECT_TRUE(v1Start->MyInt() == v2Start->MyInt());
        ++v1Start;
        ++v2Start;
    }
}

我还尝试过std :: find_if的一些组合来实现这个目标,但我找不到解决方案。

我知道在C#中我可以比较这样的内容:

foreach (MyObject m in listOne)
{
    Assert.IsTrue(listTwo.Any(i => m.MyInt == i.MyInt));
}

有人能告诉我一个更好/更简洁的方式来比较我的载体的内容。我希望尽可能使用STL和/或Boost

1 个答案:

答案 0 :(得分:4)

您可以将std::equal与适当的谓词一起使用:

bool ok = equal(begin(vectorOne), end(vectorOne),
                begin(vectorTwo), end(vectorTwo),
                [](const MyObject& w1, const MyObject& w2)
                { return w1.MyInt() == w2.MyInt(); });

上述重载在C ++ 14之前是不可用的,因此在检查向量的长度是否相同之后,您需要调用此过载:

bool ok = equal(begin(vectorOne), end(vectorOne),
                begin(vectorTwo),
                [](const MyObject& w1, const MyObject& w2)
                { return w1.MyInt() == w2.MyInt(); });