2017-06-12 88 views
0

我正在尋找檢查兩個向量交叉點的最佳方法。Boost.Test - 如何檢查交叉點上的兩個向量?

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

嵌套循環可以做的工作,但它看起來並不像一個如Boost.Test十歲上下的方式。無論看看Boost.Test有很大幫助,作爲唯一的測試用例預定義是BOOST_CHECK_EQUAL_COLLECTIONS

更新

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'不夠好,你需要解釋原因。提示:如果兩個矢量都很大,你可以用其中一個來製作BST,這將顯着加快速度。 – erip

+0

'std :: set_intersection'很好,但是如何以'BOOST_CHECK_EQUAL_COLLECTIONS'這樣的方式從'Boost.Test'中獲取相應的答案(值和確切位置)? – user1587451

回答

4

在單元測試中你通常不關心,只要是合理的驗證代碼的性能。

我只會寫一個模板函數sets_intersect取兩個向量,將其中一個插入到std::hash_set中,並遍歷第二個向量直到第一個匹配。或者只是對它們進行排序並用std::set_intersection進行檢查。

最終的語法類似於BOOST_CHECK(sets_intersect(vec1, vec2)),它看起來足夠人性化。