2013-04-10 32 views
2

我試着去理解給定here下面的例子:這個使用boost :: mismatch的例子是什麼意思?

template<class SinglePassRange1, class SinglePassRange2> 
std::pair < 
    typename range_iterator<SinglePassRange1>::type, 
    typename range_iterator<const SinglePassRange2>::type 
> 
mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2); 

這裏是說明:

不匹配找到的第一個位置,其中correseponding元素 從兩個區域RNG1和RNG2不等於。

在上面的例子中,我不清楚的主要是:給出什麼作爲輸入以及什麼是失配函數的輸出?

rng1rng2是類SinglePassRange1SinglePassRange2,分別對象。但是這些類是什麼?他們在哪裏定義?他們應該是「範圍」,但「範圍」是什麼?

我也不清楚在調用mismatch函數之前所有這些行是做什麼的。第一行看起來像我們要定義一個類模板,但我們以後不會這樣做。

回答

1

我也不清楚在調用 之前所有這些行是不匹配的。第一行看起來像我們要 定義一個類模板,但我們不會在以後做。

這不是一個例子。它是函數模板的聲明,它是boost範圍庫的一部分。

在上面的例子中,我不清楚的主要是:什麼 作爲輸入給出,什麼是輸出的失配函數?

如您在鏈接的頁面上進一步記錄的那樣,輸入必須具有單通範圍概念模型的類型。升壓

更多信息可用範圍IST在http://www.boost.org/doc/libs/1_50_0_beta1/libs/range/doc/html/range/introduction.html

由於沒有提到的,最常見的用途是在標準集裝箱通過。內置陣列也可以工作。並且boost::iterator_range允許您使用任何形式範圍的(前向)迭代器對。

所以你可以有

vector<string> vec { ... }; 
list<string> lis { ... }; 

auto result = mismatch(vec, lis); 

這裏result將有型pair<boost::range_iterator<vector<string>>::type, boost::range_iterator<list<string>>::type>

2

的範圍是對同一容器上運行的迭代器。 A SinglePassRange就是這樣的一個範圍,迭代器是單通迭代器,即。迭代器,可比較和增量。通過超載mismatch函數,參數也可以是支持該類型範圍迭代器的容器,在這種情況下,使用容器的迭代器begin()end()

返回的值是第一對迭代器 - 每個範圍之一 - 不滿足等式謂詞。該對是在模板參數聲明之後的第一對幾行描述的內容。

std::pair < 
    typename range_iterator<SinglePassRange1>::type, 
    typename range_iterator<const SinglePassRange2>::type 
> 

如您所見,每個參數都是每個範圍類型的範圍迭代器的類型。

關鍵字typename之前參數是必要的,因爲兩者實際上是dependent names,即。在其他類型中定義的類型,它們本身取決於外部模板參數(SinglePassRange1和2)。

mismatch函數可能類似於以下(消隱類型):

auto mismatch(auto &rng1, auto &rng2){ 
    auto it1 = rng1.first, it2 = rng2.first; 
    while (it1 != rng1.second && it2 != rng2.second) 
      if (it1 != it2) 
       break; 
      else { ++it1; ++it2; } 
    return make_pair(it1, it2); 
}