2017-01-25 3 views
2

私はCatchユニットテストフレームワークを使用しています。私はダブルスのベクトルを比較したいと思います。このother answerは、Approxを使用して浮動小数点/倍精度値を比較することを提案していますが、これはそのベクトルでは機能しません。これを達成するための便利な方法はありますか?キャッチを使用したダブルスのベクトル比較

EDIT:次のコードで例

#define CATCH_CONFIG_MAIN 
#include "catch.hpp" 

TEST_CASE("Compare Vectors", "[vector]") { 
    std::vector<int> vec1 = {0, 1, 2, 3}; 
    std::vector<int> vec2 = {0, 1, 2, 4}; 
    REQUIRE(vec1 == vec2); 
} 

テストは、次のレポートで失敗します。

------------------------------------------------------------------------------- 
Compare Vectors 
------------------------------------------------------------------------------- 
test/UnitTests/test_Example/example.cc:4 
............................................................................... 

test/UnitTests/test_Example/example.cc:7: FAILED: 
    REQUIRE(vec1 == vec2) 
with expansion: 
    { 0, 1, 2, 3 } == { 0, 1, 2, 4 } 

=============================================================================== 
test cases: 1 | 1 failed 
assertions: 1 | 1 failed 

しかし、次のように、私は、コードを変更した場合、私はしたいと思いますテストは合格するが、明らかにそれは合格しない。

#define CATCH_CONFIG_MAIN 
#include "catch.hpp" 

TEST_CASE("Compare Vectors", "[vector]") { 
    std::vector<double> vec1 = {0, 1, 2, 3}; 
    std::vector<double> vec2 = {0, 1, 2, 3.000001}; 
    REQUIRE(vec1 == vec2); 
} 

私ができる要素をループし、それらを一つずつ比較が、不一致の場合には、エラーの原因を決定することはより困難であろう。

+1

ベクトルをループして要素ごとに比較するとどうなりますか? [この質問](http://stackoverflow.com/q/41160846/3093378)も参照してください。 – vsoftco

+0

@vso私は問題は、どのようにベクトルをループするのではなく、その間に浮動小数点数を比較する方法ではないと思います。 –

答えて

1

当面は、私は一種の回避策に頼ってきました。私は次の2つの関数を作成して、2つのベクトルをチェックする必要がある場合に使用します。あなたは、少なくとも失敗したベクトルの名前、および異なっ最初の値を確認できるようになります(すなわち、REQUIRE(compareVectors(vec1, vec2));

bool compareVectors(std::vector<double> a, std::vector<double> b) { 
    if (a.size() != b.size()) return false; 
    for (size_t i = 0; i < a.size(); i++) { 
     if (a[i] != Approx(b[i])) { 
      std::cout << a[i] << " Should == " << b[i] << std::endl; 
      return false; 
     } 
    } 
    return true; 
} 

bool compare2dVectors(std::vector<std::vector<double>> a, 
         std::vector<std::vector<double>> b) { 
    if (a.size() != b.size()) return false; 
    for (size_t i = 0; i < a.size(); i++) { 
     if (! compareVectors(a[i], b[i])) return false; 
    } 
    return true; 
} 

その方法。

それは理想的な解決策ではないので、私はまだ誰かが何か良いものを考え出すことを望んでいますが、少なくとも私がこれまでに思いついたことを分かち合いたいと思いました。 。

+0

私はまったく同じ問題に直面しています。私はより洗練されたソリューションで面白いです。 – schorsch312

関連する問題