我有一個向量。我想比較一下它們是否相同。例如如何編寫一個方法來比較矢量和聚合?
vector<int> v{0, 1, 2};
bool b = equal(v, {0, 1, 2}); // how to write a method to implement it???
我有一個向量。我想比較一下它們是否相同。例如如何編寫一個方法來比較矢量和聚合?
vector<int> v{0, 1, 2};
bool b = equal(v, {0, 1, 2}); // how to write a method to implement it???
只需要將它們與==
運算符進行比較。
bool v_equal(const std::vector<int>& v1, const std::vector<int>&v2) {
return v1==v2;
}
呼叫功能,如:
bool isEqual = v_equal(v1,{0, 1, 2});
您可以使用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,如果你沒有訪問它,你必須檢查長度是否相同。
您還需要檢查長度是否相同 - 如果初始化程序列表的長度大於矢量但是以相同元素開始,則會報告「true」如果列表較短,會導致未定義的行爲。 –
[爲什麼寫東西?](http://en.cppreference.com/w/cpp/algorithm/equal) – user4581301
'{0,1,2}'不是一個聚合,它是一個大括號包含的列表。我假設你的意思是你想檢查矢量是否與從列表中初始化的矢量相同。 –
@ user4581301'std :: equal'需要3個迭代器,因此它不能與任何類似於OP的僞代碼的語法一起使用 –