2015-05-14 34 views
2

我想以更好(更快)的方式編寫代碼。 我有一個容器向量和一個簡單的數組。 我想比較向量的內容與數組的內容。 假設我有類是這樣的:如何在cpp中以有效的方式比較向量與數組?

struct A 
{ 
    float aa; 
    struct(float p_aa) : aa(p_aa) {} 
}; 

struct B : public A 
{ 
    A bb; 
    struct(float p_aa) : A(p_aa) {} 
}; 

而且我也有一個容器,一個簡單的數組:

std::vector<B> l_v = {B(1), B(3)}; 
B l_b[2] = {B(1), B(3)}; 

的功能,它在容器與陣列比較是:

bool isTheSame(const std::vector<B> &l_v, B *l_b) 
{ 
    unsigned int count = 0; 
    for(auto it = l_v.begin(); it!= l_v.end(); ++it) 
    { 
     if(l_b[count].aa != it->aa) 
     { 
      return false; 
     } 
     ++count; 
    } 
    return true; 
} 

我想使用lambda或foreach以更好的方式編寫它。你有什麼想法?謝謝。

+0

['STD :: equal'](http://en.cppreference.com/w/cpp/algorithm/equal) – Borgleader

回答

6

使用std::equal

bool isTheSame(const std::vector<B> &l_v, B *l_b) 
{ 
    return std::equal(l_v.begin(), l_v.end(), l_b, 
         [](const B& lhs, const B& rhs){ 
          return lhs.aa == rhs.aa; 
         }); 
} 

注意,這兩者和你的代碼的前提是矢量和陣列具有相同的大小。更好的實現是在l_b長度還傳遞這樣就可以保證你不會從l_b讀取未初始化的內存:

bool isTheSame(const std::vector<B> &l_v, B *l_b, size_t len) 
{ 
    return len == l_v.size() && 
     std::equal(l_v.begin(), l_v.end(), l_b, same_pred); 
} 

或Array:

template <size_t N> 
bool isTheSame(const std::vector<B> &l_v, const B (&l_b)[N]) 
{ 
    return N == l_v.size() && 
     std::equal(l_v.begin(), l_v.end(), l_b, same_pred); 
} 
+0

您需要傳遞長度的唯一原因是您決定傳遞一個指針而不是對數組的引用。這是沒有必要的。 – juanchopanza

相關問題