2017-06-22 93 views
1

我一直在尋找周圍,和編碼的std ::算法出於某種原因,一些基本的例子我從來沒有發現很奇怪,他們喜歡這個工作,例如:C++ STL函數模板類型推演

#include <vector> 
#include <algorithm> 
int main(){ 
    std::vector<int> vec; 
    vec.resize(100); 

    std::generate(std::begin(vec), std::end(vec), std::rand); 
    auto element = std::max_element(std::begin(vec), std::end(vec)); 
} 

爲什麼它不需要模板參數是這樣的:

std::generate<std::vector<int>::iterator>(... 
std::max_element<std::vector<int>::iterator>(... 
+1

你的標題已經有了答案......'std :: being(vec)'是'std :: vector :: iterator',所以不需要再次告訴編譯器 – user463035818

+1

我不確定你在問什麼。你問你爲什麼不需要爲generate()和max_element顯式定義一個迭代器? std :: begin和std :: end返回迭代器,矢量的類型包含在vec中。 – quinz

回答

3

std::generate可能的實現:

template<class ForwardIt, class Generator> 
void generate(ForwardIt first, ForwardIt last, Generator g) 
{ 
    while (first != last) { 
     *first++ = g(); 
    } 
} 

這裏ForwardIt類型由編譯器firstlast參數推導。

然後,std::beginstd::end函數都會爲容器返回迭代器。在你的情況下,這些是std :: vector迭代器。

因此,ForwardIt推導爲std :: vector類型的迭代器,您不必明確指定它。

相同的邏輯適用於其他算法。

+0

編輯帖子來糾正一個小問題,我只是想補充說,_template參數deduction_是關鍵詞,如果op要搜索更多關於這個問題。 – Zlatomir

+0

@ Zlatomir感謝您提供更好的措辭的答案) –

2

std::beginstd::end返回迭代器,所以你不需要明確告訴它的編譯器。同樣,當您將矢量作爲參數傳遞給這兩個函數時,編譯器將知道模板參數。