2009-06-03 12 views
1

Je travaille sur l'intro C++ devoirs, mais je suis coincé.C++ instances de classe

Account *GetAccount(int an); 

int main() 
{ 
Account *a1,*a2,*b1; 
a1=GetAccount(123); 
a2=GetAccount(456); 
b1=GetAccount(123); 
if(a1==b1) 
    cout<<"YES"<<endl; 
else 
    cout<<"NO"<<endl; 

méthode GetAccount est censé vérifier si l'instance existe déjà avec le même numéro de compte, si elle le fait, retourne cette instance.

méthode Seulement je peux penser est de créer une matrice de compte et de recherche pour le compte, alors si elle n'existe pas, insérer un nouveau compte dans le tableau. S'il existe, renvoie le pointeur sur le tableau.

Cette méthode ne me semble pas vraiment efficace, et est-il une autre façon?

+0

Oui. La façon la plus efficace de vérifier cela est le tableau, mais puisque vous voulez retourner l'instance, vous avez besoin d'un espace de pointeur. Supposons que vous prévoyez 500 comptes, soit 500x4 octets = 2000 octets ou 1.95 ko. Avec des pointeurs de 32 bits bien sûr. Une recherche typique serait comme ceci Compte * GetAccount (int an) { return accountsArray [an]; } AccountsArray peut être un tableau statique créé au moment de la compilation ou de la mémoire dynamique, vous choisissez. Bien sûr, les autres solutions sont également très bonnes. En utilisant la carte ou le vecteur est bien. – toto

Répondre

1

Vous pouvez utiliser un std::map au lieu d'un simple tableau.

2

Tenir compte hash tables.

+2

Sélection d'une structure de données appropriée pour s'adapter à la sémantique de ce que vous faites ne relève pas vraiment de l'optimisation prématurée, à mon avis; ça fait partie du design. Si vous commencez à utiliser la bonne approche, ou si vous utilisez une approche sémantiquement conforme à ce que vous voulez, tout refactoring ultérieur que vous aurez à faire sera plus facile. Knuth a mis en garde contre le fait de s'attaquer aux «petites efficacités», et non de corriger les mauvais choix de conception. – Rob

+0

Tout à fait raison, post édité. Merci pour votre commentaire. –

0

Créer un std :: carte de compte # => objet de compte.

8

Oui. Au lieu de tableau, utilisez une carte. Il remplir être plus efficace en termes d'espace, et presque aussi vite.

Vous pouvez utiliser STL et de garder vos comptes dans un std :: carte, une de ces variantes:

map<int, Account> or 
map<int, Account*> 

Dans le premier cas, vous gardez les comptes sur la carte, dans le second vous gardez la pointeurs sur les comptes, et sont responsables de la création/suppression. Quelle variante est plus appropriée? Cela dépend de la façon dont vous créez/initialisez le compte.


tutoriel sur l'utilisation de la carte STL

J'exlain le cas quand vous gardez les pointeurs sur la carte.

Voici comment vous déclarer la carte:

map<int, Account*> accounts; 

Voici comment vous pouvez ajouter un nouveau compte à la carte:

int account_id = 123; // or anything else 

Account* account = new Account(...paramters for the constructor...) 
// any additional code to initialize the account goes here 

accounts[account_id] = account; // this adds account to the map 

Voici comment vérifier si le compte avec account_id est sur la carte:

if (accounts.find(account_id) != accounts.end()) { 
    // It is in the map 
} else { 
    // it is not in the map 
} 

Voici comment vous obtenez le pointeur sur un compte de la carte:Enfin, quelque part à la fin de votre programme, vous devez nettoyer la carte et supprimer tous les objets du compte. Le programme fonctionnera bien même sans le nettoyage, mais il est important de nettoyer après vous. Je laisse ceci comme un exercice pour vous :) Trouvez comment parcourir tous les éléments de la carte, et appliquez la suppression appropriée.

+0

Je suis très novice en C++, et j'ai fait des recherches sur google pour la carte. La plupart des pages sont difficiles à comprendre, et elles ne parlent pas vraiment de carte avec des objets. Y a-t-il une source? –

+0

jetez un oeil aux méthodes d'insertion et d'effacement pour l'insertion et l'enlèvement de base. Vous pouvez également utiliser la syntaxe d'index (myMap ["key"] = 12), mais soyez averti qu'il crée des entrées si elles n'existent pas. Comme avec tous les conteneurs STL, vous devrez vous familiariser avec le concept des itérateurs. Si vous allez utiliser STL (et je pense que vous devriez), je vous recommande de jeter un oeil à la référence Josuttis. En ce qui concerne l'utilisation avec des objets, sachez que l'insertion dans la carte fait une copie du type que vous stockez - si vous stockez des pointeurs, il ne fait que copier le pointeur, etc. –

+0

Je ne connais aucun tutoriel vraiment bon sur Cartes STL. Je mettrai à jour ma réponse dans une seconde pour expliquer comment utiliser les cartes STL. –

2

Cette méthode ne me semble pas vraiment efficace, et existe-t-il un autre moyen?

Oui, comme d'autres l'ont mentionné, il existe des moyens plus efficaces d'utiliser des structures de données autres que des tableaux. Cependant, si vous avez récemment étudié des tableaux et des boucles dans votre classe, la méthode que vous décrivez correspond probablement à ce que votre instructeur attend. Je n'essaierai pas d'obtenir trop loin devant votre instructeur, car la méthode des tableaux et des boucles est probablement le genre de choses que vous devez connaître lorsque vous passez vos examens. C'est aussi une bonne idée d'avoir une base solide dans les bases avant d'aller de l'avant. (Ne laissez pas cela vous empêcher de poser des questions plus avancées ici, cependant.)

1

La méthode que vous avez proposée, un tableau d'identifiants que vous parcourez et testez, est très facile. J'utiliserais un std :: vector, cependant, pas un tableau, car vous n'avez donc pas à vous soucier de la taille. Sinon, vous venez de déclarer un grand tableau et de tester qu'il n'est pas plein lors de l'ajout. En termes d'efficacité, faire une recherche linéaire sur un petit tableau (par centaines) est assez rapide, et peut être plus rapide que d'autres solutions, comme les cartes et les ensembles. Cependant, il ne s'agence pas bien. Essayez d'écrire votre code correctement, mais ne vous inquiétez pas de l'optimiser jusqu'à ce que vous sachiez que vous avez un problème. Je préférerais que mes programmeurs écrivent un code propre, facile à maintenir, plutôt que d'opter pour une vitesse optimale. Nous pouvons toujours accélérer les choses plus tard, s'il le faut.

Questions connexes