2009-12-28 12 views
4

J'ai donc quelque chose comme çavariables globales en C++

#define HASHSIZE 1010081 

static struct nlist *hashtab[HASHSIZE]; 

Maintenant, je veux être en mesure de changer le HASHSIZE de mon HashTab, parce que je veux tester différents nombres de nombres premiers et voir ce qui me donnerait moins de collisions . Mais les tableaux ne prennent pas de tailles variables, donc HASHSIZE doit être une constante. Y a-t-il un moyen de s'y prendre?

+0

Nous avons besoin de plus d'informations. Essayez-vous de redimensionner la table de hachage à la volée? Vous pourriez utiliser un 'std :: vector' à la place d'un tableau natif, mais vous devriez re-seau tout ce qui est déjà dans la table au moment de votre redimensionnement. –

+0

re-seau ??????????? – SuperString

+1

@SuperString Adrian signifie que si vous changez la taille d'un vecteur après l'avoir alloué, vous devrez recalculer les seaux dans lesquels chaque élément est. Je ne pense pas que vous demandiez de redimensionner une table de hachage existante, cependant, je pense que vous demandais simplement comment créer des tables de hachage de différentes tailles. –

Répondre

10

Pourquoi utilisez-vous pas std::vector au lieu d'utiliser des tableaux en C++?

Par exemple:

std::vector<nlist *> hashtab; 
    hashtab.resize(<some_value>); 

Mais de toute façon, vous pouvez le faire si vous utilisez g++ parce que g++ supporte les tableaux de longueur variable (VLA) comme une extension.

Par exemple:

int HASHSIZE=<some_value> 
    static struct nlist *hashtab[HASHSIZE]; 
0

Pourquoi n'utilisez-vous pas simplement une constante?

const int HASHSIZE = 1010081; 

Une constante est disponible pour le compilateur en tant que valeur littérale de sorte qu'il peut être utilisé pour initialiser des tableaux (amoung autres).

+0

Je vais changer sa valeur, donc ne travaillera pas? – SuperString

+2

Cependant, il est préférable d'utiliser '# define'. –

10

utilisez std :: vector, décrit dans n'importe quel bon livre sur C++.

Vecteur fonctionne comme un tableau mais est redimensionnable, aussi sa taille initiale ne doit pas être une constante de compilation.

#include <vector> 

std::vector<nlist*> hash; //empty hash 
hash.resize(1010081); //now it has 1010081 elementns 
1

Vous pouvez utiliser std::vector comme recommandé par robson3.14 ou allouer le tableau sur le tas avec new. Si vous choisissez d'attribuer sur le tas assurez-vous de delete []

4

Pourquoi avez-vous une variable globale pour votre table de hachage? Au lieu de cela, vous devriez probablement créer une structure ou une classe, qui peut contenir la taille de la table et un pointeur vers la table, et allouer dynamiquement sa mémoire. La taille par défaut est la suivante, mais vous pouvez passer une taille différente lors de la création de la table de hachage pour essayer différentes tailles.

class HashTable { 
public: 
    HashTable(int size = 1010081) : m_size(size) { 
    m_table = new nlist *[m_size]; 
    } 
    ~HashTable() { 
    delete[] m_table; 
    } 

    // Define getters, setters, etc. here... 

private: 
    int m_size; 
    struct nlist **m_table; 
}; 

Note: Je suppose (basé sur le fait que vous essayez de mettre en œuvre votre propre table de hachage, et certaines de vos questions précédentes) que vous êtes intéressé à apprendre sur le bas niveau mise en œuvre d'une table de hachage, et donc je vous donne une réponse assez bas sur la façon d'allouer et libérer la mémoire vous-même. Dans un programme réel, utiliser std::vector, comme décrit par plusieurs des autres réponses, serait probablement la bonne chose à faire, car cela réduit la quantité de comptabilité que vous devez faire vous-même. Là encore, dans un programme réel, vous ne voudriez probablement pas implémenter votre propre table de hachage, mais plutôt utiliser une implémentation de table existante comme hash_map (non standard, mais largement disponible), boost::unordered_map, ou std::tr1::unordered_map (c'est sur la piste pour devenir un standard, et basé sur boost::unordered_map).

0

Des tableaux de longueurs variables ont été ajoutés à C dans C99. C99 n'est cependant pas inclus dans la norme C++. GCC 4.2.Cela dit, l'allocation du tableau sur le tas en utilisant soit un vecteur std :: soit le nouvel opérateur est toujours préférable pour les grandes allocations de mémoire, car l'espace de pile peut être limité et dépassant la pile est une erreur irrécupérable. Les allocations de tas peuvent toujours être vérifiées.