2017-06-12 18 views
0

交差点の2つのベクトルをチェックする最良の方法を探しています。Boost.Test - 交差点上の2つのベクトルをチェックする方法?

for (auto const & first: first_vector) 
    for (auto const & next: next_vector) 
    if first == next 
     return false; 

のようなネストされたループは、仕事をすることができますが、それはBoost.Testっぽい道のようには見えません。ユニットテストで事前に定義のみテストケースがBOOST_CHECK_EQUAL_COLLECTIONS

あるようBoost.Testを見に多くのことができます更新

BOOST_FIXTURE_TEST_CASE(paths,fixture_t) 
{ 
    for(int i=0,j=vids.size(); i!=j; i++) 
    { 
    for(int p=0,q=vids.size(); p!=q; p++) 
    { 
     if (i == p) 
     { 
     continue; 
     } 
     if (i < p) 
     { 
     BOOST_TEST_CONTEXT("Equal match at positions " << i << " and " << p) 

     BOOST_TEST(vids[i] != vids[p]); 
     } 
    } 
    } 
} 
+3

['std :: set_intersection'](http://en.cppreference.com/w/cpp/algorithm/set_intersection)? – NathanOliver

+2

パフォーマンスは、両方のベクトルのサイズに大きく依存します。 'std :: set_intersection'で十分でない場合は、理由を説明する必要があります。ヒント:両方のベクトルが大きい場合は、それらのうちの1つからBSTを作成することができます。これにより、処理速度が大幅に向上します。 – erip

+0

'std :: set_intersection'は問題ありませんが、' BOOST_CHECK_EQUAL_COLLECTIONS'のように 'Boost.Test'から対応する答えを得る方法(値と正確な位置)はありますか? – user1587451

答えて

4

どちらも、あなたは通常であれば合理的であるとして、検証コードのパフォーマンスを気にしないでください。

テンプレートの関数sets_intersectは、2つのベクトルをとり、std::hash_setにそのうちの1つを挿入し、最初の一致まで2番目のベクトルを走査します。または、両方をソートしてstd::set_intersectionとチェックしてください。

最終的な構文は人間にとって十分に見えるBOOST_CHECK(sets_intersect(vec1, vec2))のようなものになります。

関連する問題