C++ 如何比较std::vectors的内容与自定义对象

C++ 如何比较std::vectors的内容与自定义对象,c++,c++11,boost,vector,stl,C++,C++11,Boost,Vector,Stl,我有两个向量,其中包含我在单元测试中使用的自定义对象。我无法更改向量中包含的对象的实现,并且这些对象不包含==重载 在单元测试结束时,我想比较这些向量中的每个对象,以确定它们在一个成员变量中是否具有相同的值 目前,我正在对向量进行排序,然后对内容进行循环,如下所示: // Sort predicate bool SortHelper(MyObject& w1, const MyObject& w2) { return (w1.MyInt() < w2.MyInt()

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

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

目前,我正在对向量进行排序,然后对内容进行循环,如下所示:

// 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;
    }
}
foreach (MyObject m in listOne)
{
    Assert.IsTrue(listTwo.Any(i => m.MyInt == i.MyInt));
}
有人能给我一个更好/更简洁的方法来比较向量的内容吗。我希望尽可能使用STL和/或Boost,您可以将其与适当的谓词一起使用:

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(); });
可以与适当的谓词一起使用:

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(); });

如果使用
std::equal
的两个范围版本(而不是一个半范围),将自动检查相同的长度。在C++11之前不存在lambda的版本中,如果定义自定义全局
bool运算符==(const MyObject&,const MyObject&),则仍然可以使用
std::equal()
,或者可以传递给
equal()
@BenjaminLindley Good point的自定义谓词。我忘了在C++ 14中添加了两个版本的版本。我在C++ 11(Visual Studio 2010,所以大部分是C++ 11),所以我认为以上正是我想要的。首先检查长度。@juanchopanza:对于c++14,可以使用
cbegin
/
cend
auto&
来检查lambdai,如果使用
std::equal
的两个范围版本(而不是范围半),则会自动检查相同的长度。在c++11之前的版本中,lambda不存在,如果定义自定义全局
bool运算符==(const MyObject&,const MyObject&),或者可以传递给
equal()
@BenjaminLindley Good point的自定义谓词,则仍然可以使用
std::equal()
。我忘了在C++ 14中添加了两个版本的版本。我在C++ 11(Visual Studio 2010,所以大部分是C++ 11),所以我认为以上正是我想要的。首先检查长度。@juanchopanza:对于c++14,可以使用
cbegin
/
cend
auto&
作为lambda