2016-06-09 78 views
-4

我有一個向量。我想比較一下它們是否相同。例如如何編寫一個方法來比較矢量和聚合?

vector<int> v{0, 1, 2}; 

bool b = equal(v, {0, 1, 2}); // how to write a method to implement it??? 
+0

[爲什麼寫東西?](http://en.cppreference.com/w/cpp/algorithm/equal) – user4581301

+0

'{0,1,2}'不是一個聚合,它是一個大括號包含的列表。我假設你的意思是你想檢查矢量是否與從列表中初始化的矢量相同。 –

+1

@ user4581301'std :: equal'需要3個迭代器,因此它不能與任何類似於OP的僞代碼的語法一起使用 –

回答

5

只需要將它們與==運算符進行比較。

bool v_equal(const std::vector<int>& v1, const std::vector<int>&v2) { 
    return v1==v2;  
} 

呼叫功能,如:

bool isEqual = v_equal(v1,{0, 1, 2}); 
5

您可以使用std::initializer_list爲此目的,例如

#include <iostream> 
#include <vector> 
#include <algorithm> 

bool equal(const std::vector<int>& v1, const std::initializer_list<int>& v2) { 
    return std::equal(v1.begin(), v1.end(), v2.begin(), v2.end()); 
} 

int main() { 
    std::vector<int> data1 = {1,2,3,4}; 
    std::cout << std::boolalpha << equal(data1, {1,2,3,4}) << std::endl; 
    return 0; 
} 

你甚至可以使用模板模板參數寫一個通用的函數,它是能夠評估兩個集合,只要它們爲包含的類型提供迭代器和operator==,如下所示:

template<typename T, template<typename...> class C1, typename U, template<typename...> class C2> 
bool is_equal(const C1<T>& v1, const C2<U>& v2) { 
    return std::equal(v1.begin(), v1.end(), v2.begin(), v2.end()); 
} 

但要使用emphasized textstd::initializer_list進行演繹工作,您需要適當地施展它們,然後像​​(std::initializer_list<int>){1,2,3,4}一樣。

接受4個迭代器的std::equal重載只是C++ 14,如果你沒有訪問它,你必須檢查長度是否相同。

+0

您還需要檢查長度是否相同 - 如果初始化程序列表的長度大於矢量但是以相同元素開始,則會報告「true」如果列表較短,會導致未定義的行爲。 –