2017-06-22 1 views
1

J'ai regardé autour de, et coder quelques exemples de base pour std :: algorithme et pour une raison que je ne trouvais étrange qu'ils fonctionnent comme ceci par exemple:C++ fonctions stl déduction de type de modèle

#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)); 
} 

Comment se fait-il ne nécessite pas de paramètres du modèle comme celui-ci:

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

votre titre a déjà la réponse ... 'std :: being (vec)' est un 'std :: vector :: iterator', donc pas besoin de le redire au compilateur – user463035818

+1

Je ne suis pas sur ce que vous demandez. Demandez-vous pourquoi vous n'avez pas besoin de définir explicitement un itérateur pour generate() et max_element? std :: begin et std :: end retournent les itérateurs et le type du vecteur est inclus dans vec. – quinz

Répondre

3

Regardez std::generate la mise en œuvre possible:

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

Voici le type ForwardIt est déduit par le compilateur à partir des paramètres first et last.

Ensuite, les deux fonctions std::begin et std::end renvoient des itérateurs pour le conteneur. Ce sont std :: vector itérateurs dans votre cas.

Par conséquent, ForwardIt est déduit comme un type de std :: vector itérateur et vous n'avez pas à le spécifier explicitement.

La même logique s'applique à d'autres algorithmes.

+0

J'ai modifié le post pour corriger un petit problème et je veux juste ajouter que _template argument deduction_ est le mot-clé si op veut chercher plus sur ce sujet. – Zlatomir

+0

@Zlatomir merci de fournir la réponse avec une meilleure formulation) –

2

std::begin et std::end itérateurs retour de sorte que vous n'avez pas besoin de le dire explicitement au compilateur. De même que vous passez le vecteur en tant que paramètre à ces deux fonctions, le compilateur connaîtra le paramètre template.