首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将向量与Boost.Test进行比较?

如何将向量与Boost.Test进行比较?
EN

Stack Overflow用户
提问于 2010-10-23 02:05:53
回答 3查看 15.9K关注 0票数 26

我正在使用Boost Test对一些C++代码进行单元测试。

我有一个值向量,需要与预期结果进行比较,但我不想手动检查循环中的值:

代码语言:javascript
复制
BOOST_REQUIRE_EQUAL(values.size(), expected.size());

for( int i = 0; i < size; ++i )
{
    BOOST_CHECK_EQUAL(values[i], expected[i]);
}

主要问题是循环检查不会打印索引,因此需要进行一些搜索才能找到不匹配项。

我可以在这两个向量上使用std::equalstd::mismatch,但这也需要大量的样板。

有没有更干净的方法来做这件事?

EN

回答 3

Stack Overflow用户

发布于 2013-07-06 21:27:17

然而,当人们有时需要使用comparison with tolerance比较浮点数的集合时,这段代码可能会有用:

代码语言:javascript
复制
// Have to make it a macro so that it reports exact line numbers when checks fail.
#define CHECK_CLOSE_COLLECTION(aa, bb, tolerance) { \
    using std::distance; \
    using std::begin; \
    using std::end; \
    auto a = begin(aa), ae = end(aa); \
    auto b = begin(bb); \
    BOOST_REQUIRE_EQUAL(distance(a, ae), distance(b, end(bb))); \
    for(; a != ae; ++a, ++b) { \
        BOOST_CHECK_CLOSE(*a, *b, tolerance); \
    } \
}

这不会打印不匹配元素的数组索引,但会以高精度打印不匹配的值,因此通常很容易找到它们。

示例用法:

代码语言:javascript
复制
auto mctr = pad.mctr();
std::cout << "mctr: " << io::as_array(mctr) << '\n';
auto expected_mctr{122.78731602430344,-13.562000155448914};
CHECK_CLOSE_COLLECTION(mctr, expected_mctr, 0.001);
票数 16
EN

Stack Overflow用户

发布于 2017-03-29 19:22:57

从Boost 1.59开始,比较std::vector实例就容易多了。请参阅1.63版的this documentation (在这方面几乎等同于1.59版)。

例如,如果您声明了std::vector<int> a, b;,则可以编写

代码语言:javascript
复制
BOOST_TEST(a == b);

来得到一个非常基本的比较。这样做的缺点是,在失败的情况下,Boost只会告诉你ab是不同的。但是你可以通过比较元素来获得更多的信息,这是一种优雅的方式

代码语言:javascript
复制
BOOST_TEST(a == b, boost::test_tools::per_element() );

或者,如果你想要一个字典顺序的比较,你可以这样做

代码语言:javascript
复制
BOOST_TEST(a <= b, boost::test_tools::lexicographic() );
票数 14
EN

Stack Overflow用户

发布于 2014-08-09 03:45:03

您可以将BOOST_REQUIRE_EQUAL_COLLECTIONSstd::vector<T>一起使用,但是当您有一个向量组成的向量或一个值为向量的地图时,您必须教Boost.Test如何打印std::vector。当你有一张地图时,需要教Boost.Test如何打印std::pair。由于您不能更改std::vectorstd::pair的定义,因此您必须这样做,即您定义的流插入操作符将由Boost.Test使用,而不是std::vector的类定义的一部分。此外,如果您不想仅仅为了让Boost.Test满意而向被测系统添加流插入运算符,则此技术非常有用。

以下是任何std::vector的秘诀

代码语言:javascript
复制
namespace boost
{

// teach Boost.Test how to print std::vector
template <typename T>
inline wrap_stringstream&
operator<<(wrap_stringstream& wrapped, std::vector<T> const& item)
{
    wrapped << '[';
    bool first = true;
    for (auto const& element : item) {
        wrapped << (!first ? "," : "") << element;
        first = false;
    }
    return wrapped << ']';
}

}

对于具有N元素的向量,它将向量格式化为[e1,e2,e3,...,eN],并适用于任意数量的嵌套向量,例如,向量的元素也是向量。

下面是类似的std::pair食谱

代码语言:javascript
复制
namespace boost
{

// teach Boost.Test how to print std::pair
template <typename K, typename V>
inline wrap_stringstream&
operator<<(wrap_stringstream& wrapped, std::pair<const K, V> const& item)
{
    return wrapped << '<' << item.first << ',' << item.second << '>';
}

}

假设两个集合的大小相同,BOOST_REQUIRE_EQUAL_COLLECTIONS将告诉您不匹配项的索引,以及两个集合的内容。如果它们的大小不同,则会被认为是不匹配,并且会打印不同的大小。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3999644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档