2010-07-20 3 views
2

Je ne suis pas sûr exactement ce que la classe suivante fait que nous avons pour un exemple de classe. Dans le code suivant, que fait l'opérateur() dans ce cas? Je n'ai pas tout à fait le * (début + premier) et à peu près tout l'expression de retour comme ce qui est évalué. Toute aide est la bienvenue. Merci!Aide à la compréhension du code d'exemple de classe pour C++, templates, operator()

// IndexCompare.h - interface for IndexCompare class template 
#ifndef _INDEXCOMPARE_H_ 
#define _INDEXCOMPARE_H_ 
#pragma once 

template <class random_iterator> 
class IndexCompare { 
public: 
    IndexCompare(random_iterator begin, random_iterator end) 
     : begin(begin), end(end) {} 

    ~IndexCompare() {} 

    bool operator() (unsigned int first, unsigned int second) { 
      return (*(begin + first) < *(begin + second)); 

    } 

private: 
    random_iterator begin; 
    random_iterator end; 
}; 

#endif 

Répondre

2

Si vous vous demandez ce que operator() fait, il vous permet d'appeler l'objet comme une fonction. Voir this article pour un exemple.

Si vous demandez ce que fait la fonction dans votre exemple, elle compare les valeurs de deux éléments spécifiés par les indices transmis à la fonction. begin + first se réfère à l'élément à l'index first à partir de l'itérateur begin, de même begin + second. *(begin + first) obtient la valeur à cet emplacement.

Vous pouvez utiliser cette classe avec n'importe quel conteneur STL (qui prend en charge l'accès aléatoire) en transmettant une paire d'itérateurs. Par exemple, vous pouvez l'utiliser avec un vecteur comme celui-ci:

vector<int> vec; 
/* add some elements here */ 
IndexCompare<vector<int>::iterator> compare(vec.begin(), vec.end()); 

maintenant appeler compare(2, 5) par exemple comparerait les valeurs de vec[2] et vec[5].

0

begin est un itérateur (penser pointeur), de sorte begin + first avances à la position de la première. ou dans le second cas, à la position de seconde. cependant, il ne modifie pas begin lui-même.

* est un opérateur de déréférencement, qui obtient essentiellement la valeur pointée

0

L'opérateur() définit essentiellement la fonctionnalité de '()' par rapport à votre classe. Donc dans ce cas, si nous avions une instance de IndexCompare nommée 'ic', nous pourrions écrire 'ic()' et la fonctionnalité définie serait exécutée, de la même façon qu'un appel de fonction et une définition. J'espère que cela aide à comprendre l'extension de l'opérateur.

Questions connexes