2017-06-22 94 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返回迭代器,所以你不需要明确告诉它的编译器。同样,当您将矢量作为参数传递给这两个函数时,编译器将知道模板参数。