2017-05-10 4 views
-3

Je viens d'un pays Python/Java et j'essaie de bricoler en créant mon propre hashmap en C++.Puis-je comparer les objets vectoriels à NULL?

Lorsque je tente de vérifier comparer les emplacements des postes dans la table de hachage à NULL (lignes 6 et 11), je reçois l'erreur:

invalid operands to binary expression ('value_type' (aka 'HashEntry') and 'long')" 

J'espère que quelqu'un peut me diriger dans la direction de ce que je fais mal et comment je peux le réparer.

void CustomHash::insert(HashEntry entry) { 
    int k = entry.getKey(); 
    int i = 0; 
    int hashVal = hash_One(k); 
    int temp = hashVal; 
    while (i < size && hashArray[temp] != NULL) { 
     i++; 
     temp = (hashVal + i*hash_Two(k)) % size; 
    } 

    if (hashArray[temp] == NULL) { 
     hashArray[temp] = entry; 
    } 
    else { 
     cout << "Failure" << endl; 
    } 
} 

Edit 1: Déclaration hashArray

CustomHash::CustomHash(int m) { 
    this->size = m; 
    this->hashArray = vector<HashEntry>(); 
} 
+3

Le compilateur vous indique qu'il s'agit d'une erreur. Si vous affichez la déclaration de 'hasArray', quelqu'un pourrait être en mesure d'offrir une solution. –

+0

'hashArray.count (temp)' – Justin

+0

@Justin André écrit sa propre carte de hachage comme un exercice. Il est raisonnable de supposer que 'hashArray' est de ce type et non la carte de hachage standard. En tant que tel, vous ne pouvez pas supposer qu'il a la méthode 'count'. –

Répondre

0

Compte tenu,

hashArray is a vector<HashEntry> Object

hashArray[temp] évalue à un HashEntry. Vous ne pouvez pas comparer un HashEntry avec NULL.

Utilisez une stratégie différente pour vérifier si hasArray comporte des éléments dont la clé est égale à temp. Je suggère d'utiliser std::count_if.

while (i < size && std::count_if(hashArray.begin(), hashArray.end(), 
           [=temp](HashEntry const& e) 
           { return (temp == e.getKey());}) > 0) 
{ 
    i++; 
    temp = (hashVal + i*hash_Two(k)) % size; 
} 

Une meilleure solution, comme le suggère @cdhowie, est d'utiliser std::any_of.

while (i < size && std::any_of(hashArray.begin(), hashArray.end(), 
           [=temp](HashEntry const& e) 
           { return (temp == e.getKey());})) 
{ 
    i++; 
    temp = (hashVal + i*hash_Two(k)) % size; 
} 
+0

Je suggérerais 'std :: any_of' sur' std :: count_if' puisque la condition est '> 0' - nous pouvons arrêter tôt si nous trouvons une correspondance. – cdhowie

+0

@cdhowie, merci. C'est une meilleure solution. –