c ++ stl函数模板类型推导

时间:2017-06-22 11:28:27

标签: c++ templates stl

我一直在四处寻找,为std :: algorithm编写一些基本的例子,由于某种原因,我从来没有发现它们像这样工作的奇怪:例如:

#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>( ...

2 个答案:

答案 0 :(得分: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 迭代器,您不必明确指定它。

同样的逻辑适用于其他算法。

答案 1 :(得分:2)

$("#input_box_id").autocomplete({<br> source:sourceArray/link,<br> appendTo :"#<i>my_modal</i>"<br> }); std::begin返回迭代器,因此您不需要明确告诉编译器。此外,当您将向量作为参数传递给这两个函数时,编译器将知道模板参数。