2017-06-22 68 views
8

一種特別有用的標準算法是std::equal,其被定義如下:C++ STL算法等於

template <typename InputIterator1, typename InputIterator2> 
inline bool equal(InputIterator1 start1, 
InputIterator1 end1, 
InputIterator2 start2) 
{ 
    while(start1 != end1) 
    { 
     if(*start1 != *start2) return false; 
     ++start1; 
     ++start2; 
    } 
    return true; 
} 

該算法走到由[start1, end1)[start2, start2 + (end1 – start1))並返回所定義的範圍中的範圍中的元素是否相等。請注意,該算法是對兩種不同類型的輸入迭代器進行模板化。

這是爲什麼?

+3

作爲示例,您可能想比較不同容器中的內容。 – skypjack

回答

5

它以這種方式模板化,因此您可以傳遞相同類型的兩個迭代器或不同類型的兩個迭代器。



例如:

vector<int> a; //some stuff 
list<int> b; //some stuff 
equal(a.begin(), a.end(), b.begin()); 
/* 
Here InputIterator1 is a vector<int>::iterator 
and InputIterator2 is a list<int>::iterator 
*/ 

vector<double> c; //some stuff 
vector<double> d; //some stuff 
equal(c.begin(), c.end(), d.begin()); 
/* 
Here InputIterator1 is a vector<double>::iterator 
and InputIterator2 is also a vector<double>::iterator 
*/ 
12

比方說你有一個std::list<int>std::vector<int>,想看看它們是否相等。如果std::equal沒有采用不同的迭代器類型,則不能使用它,因爲std::list<int>::iteratorstd::vector<int>::iterator的類型不同。

這也適用於相同的容器類型,但存儲不同的元素。 A std::vector<int>::iteratorstd::vector<long long>::iterator不一樣,因此如果它們對於兩個迭代器對使用相同類型,那麼您將無法對它們進行比較。

+0

它不只是可以容納不同的容器 - 你可以比較'矢量'到'矢量'。 –

+0

@MarkRansom我也會添加它。 – NathanOliver

+0

很好措辭。對不起,我不能給你第二個+1。 –

8

到目前爲止,您已經得到了兩個關注容器的答案。這是錯誤的重點。 STL中的基礎數據抽象是序列。一個序列由一對迭代器定義。容器是管理序列的一種方式,但它們不是唯一的方法。所以,要給正確 < g>回答:

std::equal比較兩個序列的相等性。沒有理由將算法的應用限制在具有相同迭代器類型的序列上,因此沒有這種限制。這些序列可能有不同的起源,並且可能涉及不同的值類型。

例如,您可能想要檢查在一個包含double值的文本表示的文件中表示的值是否與存儲器中存儲的整數向量的內容相同。矢量定義了一個序列;你可以通過begin()end()得到它的迭代器。該文件定義了一個序列;您可以通過使用ifstream打開文件並創建一對istream_iterator<double>對象來獲取其迭代器。 std::equal(以及所有其他的標準算法)可以很好地處理這些不同的數據源和不同的數據類型。