我一直在四处寻找,为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>( ...
答案 0 :(得分:3)
查看std::generate可能的实施:
template<class ForwardIt, class Generator>
void generate(ForwardIt first, ForwardIt last, Generator g)
{
while (first != last) {
*first++ = g();
}
}
此处ForwardIt
类型由编译器从first
和last
参数中推断出来。
然后,std::begin和std::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
返回迭代器,因此您不需要明确告诉编译器。此外,当您将向量作为参数传递给这两个函数时,编译器将知道模板参数。