2013-05-07 16 views
31

第一個例子:我可以使用'=='來比較兩個向量。我試過了,似乎工作正常。但我不知道是否會在更復雜的情況下工作

int main(){ 
    using namespace std; 
    vector<int> v1{10, 20, 30, 40, 50}; 
    vector<int> v2{10, 20, 30, 40, 50}; 

    if(v1==v2) 
     cout<<"equal"; 
    else 
     cout<<"unequal"; 
} // it returns equal 

第二個例子:

int main(){ 
    using namespace std; 
    vector<int> v1{10, 20, 30, 40, 50}; 
    vector<int> v2{10, 20, 100000, 40, 50}; 

    if(v1==v2) 
     cout<<"equal"; 
    else 
     cout<<"unequal"; 
} // it returns notequal 

回答

42

overload of operator == that works on two std::vectors將比較矢量大小和返回false如果這些是不同的;如果不是,它將逐個比較向量的內容。

如果爲向量的元素類型定義了operator ==,則通過operator ==的向量的比較是有效和有意義的。

在公式中,C++ 11標準規定的a == b操作語義進行序列容器中,作爲(表96,第23.2.1):

==是一個等價 關係。

distance(a.begin(), a.end()) == distance(b.begin(), b.end()) && equal(a.begin(), a.end(), b.begin())

正如你可以看到,序列容器之間平等於通過對迭代的,並且是使用用於operator ==各個元件的比較定義範圍之間的std::equal算法來定義的。

+1

我認爲這裏的最後一小部分信息是:如果你排序你的向量,它的工作原理。 試試這個:std :: sort(vector.begin(),vector.end()); – AnyOneElse 2013-09-17 11:35:24

+0

@AnyOneElse你不應該這樣做矢量平等的測試作爲一個向量的元素事項的順序,以相同的元素,但以不同的順序兩個向量在數學上並不相等。但是,如果您希望以這樣一種方式處理向量平等,即元素的順序無關緊要,那麼在比較之前對它們進行排序是一種可能的解決方案。 – GBlomqvist 2017-11-23 22:34:23

5

是的,你可以使用operator==比較兩個std::vector秒。它將返回true只有在矢量相同的大小和所有的元素比較相等。

+0

我認爲這將有助於還別提有多元素之間的平等實現的,但正確的答案+1 – 2013-05-07 15:13:39

+0

@Joseph曼斯菲爾德如果其他對象及其屬性的對象撰寫?將'=='比較遞歸地比較對象是否相等? – user3437460 2016-08-06 15:51:08

2

可以檢查operator==的文檔向量:operator==,!=,<,<=,>,>=(std::vector)

從鏈接引用:

template< class T, class Alloc > 
bool operator==(vector<T,Alloc>& lhs, 
      vector<T,Alloc>& rhs); 

比較兩個容器的內容。

檢查lhs和rhs的內容是否相等,即是否lhs.size()== rhs.size()和lhs中的每個元素在rhs中的相同位置具有相同的元素。

參數:

LHS,RHS容器,其內容比較

T必須滿足以使用

版本EqualityComparable的要求

返回值

真要是的內容集裝箱是等價的,否則爲false

1

是的。一個很好的參考是cppreference.com,在那裏你可以看一下operator==vector<T>,比如這個頁面上:non-member operators,你會發現:

檢查是否LHS和RHS的內容相等,即是否 lhs.size()== rhs.size()和lhs中的每個元素在rhs中的相同位置具有等效的 元素。

1

只要你的向量包含本身可以進行比較的元素(有operator==),這是有效的,是的。但是請注意,如果你有一個包含例如指向同一對象的矢量,而不是一個對象的同一個實例,則該矢量不認爲是相同的,因爲在向量元素是什麼相比,沒有的內容因此,如果這是有道理的。

2

注意,載體是不排序,所以使用std ::等於或「==」操作者通常不能被使用以保證如果兩個向量包含非常相同的元素,但以不同的順序正確的比較。 他們做比較的向量具有相同的內容相同的順序(但不是不同的順序)。

對於很多使用情況下,這可能是不夠的。 但是,有時候您想知道兩個矢量是否具有相同的內容,但不一定是相同的順序。 對於這種情況,你需要另一個功能。

一個很好的和短期的實現是下面的一個。 有人建議在這裏:https://stackoverflow.com/questions/17394149/how-to-efficiently-compare-vectors-with-c/17394298#17394298 在那裏,你還可以找到爲什麼你可能不希望使用它的討論......

在您選擇的頭文件將這個:

#include <algorithm> 

template <class T> 
static bool compareVectors(std::vector<T> a, std::vector<T> b) 
{ 
    if (a.size() != b.size()) 
    { 
     return false; 
    } 
    ::std::sort(a.begin(), a.end()); 
    ::std::sort(b.begin(), b.end()); 
    return (a == b); 
} 

這裏示出了上述理論的示例:

std::vector<int> vector1; 
std::vector<int> vector2; 

vector1.push_back(100); 
vector1.push_back(101); 
vector1.push_back(102); 

vector2.push_back(102); 
vector2.push_back(101); 
vector2.push_back(100); 

if (vector1 == vector2) 
    std::cout << "same" << std::endl; 
else 
    std::cout << "not same" << std::endl; 

if (std::equal(vector1.begin(), vector1.end(), vector2.begin())) 
    std::cout << "same" << std::endl; 
else 
    std::cout << "not same" << std::endl; 

if (compareVectors(vector1, vector2)) 
    std::cout << "same" << std::endl; 
else 
    std::cout << "not same" << std::endl; 

的輸出將是:

not same 
not same 
same 
相關問題