2017-03-01 59 views
0

例如如何比較容器和初始化程序列表以查看它們是否相等?

template<class Container, class List> 
bool isEqual(Container const& c, List const& l) 
{ 
    return c == Container(l); // Error!! 
} 

並檢查通過

std::vector<int> v; 
bool b = isEqual(v, {1, 2, 3}); 

但錯誤在我的代碼。沒有從列表轉換到容器。如何解決這個錯誤?

+2

'返回c.size()== l.size()&&的std ::相等(std :: begin(c),std :: end(c),std :: begin(l));' –

+1

比較不是你的例子唯一的問題,'List'不能從braced-初始化列表 – Praetorian

回答

3

你舉的例子,按照目前的寫,不僅會失敗,因爲比較的編譯,而且因爲模板參數Listcannot be deduced支撐,初始化列表

要麼改變的功能

template<class Container, class T> 
bool isEqual(Container const& c, std::initializer_list<T> const& l) 

或更改你怎麼稱呼它

std::vector<int> v; 
auto l = {1, 2, 3}; 
bool b = isEqual(v, l); 
// or 
bool b = isEqual(v, std::initializer_list<int>{1, 2, 3}); 

要解決的比較,因爲伊戈爾在評論中提到的方法,使用

return c.size() == l.size() && std::equal(std::begin(c), std::end(c), std::begin(l)); 

或者,如果您有權限s到的std::equal的C++ 14重載採用開始和結束迭代器兩個範圍,則可以跳過該大小檢查

return std::equal(std::begin(c), std::end(c), std::begin(l), std::end(l)); 
相關問題