2016-08-13 3 views
-2

Ich übe die Frage, eine Hash-Tabelle nur mit Arrays zu machen.überprüfen, ob das Array vom Typ Knoten voll ist C++

Ich habe eine Hash_Entry myMap[128][128].

Kann ich alle Werte zu NULL oder 0 initiieren, obwohl es Typ hash_entry ist?

und wenn ich nicht kann mein Problem überprüft, wenn die zweite Dimension-Array voll ist.

Ich dachte an

is_Full(arr){ 
    if(arr.length()-1.key!=0 && arr.length()-1.value!=0){ 
      return false; 
    } 
    else return true; 
} 

Ist, dass ich eine gute Umsetzung

tun?

OR I gedacht, um eine zweite Anordnung zu haben, das für jede Schaufel eine Zählung inkrementiert dann testet, ob die Zählung zu der Bucket-Größe

+0

Jeder Weg sollte funktionieren (wenn mit "Eimer" Sie "Zeile" bedeuten). – Beta

+0

@Beta ja, ich meine Zeile. Was aber, wenn der letzte Punkt zufällig (0,0) für Schlüssel und Wert ist? Gibt es eine Möglichkeit, den tatsächlichen Index auf nur 0 zu setzen? –

+0

Sie * definiert * einen NULL 'Hash_Entry' als einen, der' key' = 0 ** oder ** 'value' = 0 hat. Wenn dies gültige Werte für einen Nicht-NULL-Hash-Eintrag sind, dann haben Sie diese schlecht gewählt. Wenn es kein Wertepaar gibt, das ein Nicht-NULL-Hash-Eintrag nicht haben kann, funktioniert diese Methode nicht. – Beta

Antwort

0

Dieser Code ist sicherlich nicht C++ gleich ist. Angenommen, das, was Sie tatsächlich erreichen wollen, IST in C++, können Sie eine einfache Vorlage schreiben, um zu prüfen, ob ein Mitglied von std::array einem von einem Mitglied bereitgestellten emptyValue entspricht.

#include <array> 
#include <iostream> 
#include <algorithm> 

template<typename T, size_t N, T emptyVal = NULL> 
bool arrayIsFull(const std::array<T, N> &arr) { 
    return !std::any_of(
     std::cbegin(arr),  // | const iterators 
     std::cend(arr),  // |__ c++11 and up 
     [](const T &val) { return val == emptyVal; } // simple lambda to check if any member is equal to the expected empty value. 
    ); 
}; 

Überprüfen, ob sie alle voll sind, ist trivial.

static std::array<std::array<int, 10>, 10> twoDimArr; 

void checkIfAllFull(void) { 
    bool allFull = std::all_of(
     std::cbegin(twoDimArr), 
     std::cend(twoDimArr), 
     [](const auto &oneDimArr) {return arrayIsFull(oneDimArr); } 
    ); 

    std::cout << (allFull ? "Filled up!\n" : "There's still some room!\n"); 
} 

int main(int argc, char **argv) { 

    for (auto it = std::begin(twoDimArr); it != std::end(twoDimArr); ++it) { 
     std::fill(std::begin(*it), std::end(*it), 1); 
    } 

    checkIfAllFull(); 
    twoDimArr.at(3).at(7) = 0; 
    checkIfAllFull(); 

    std::cin.get(); 
} 

Ich bin mir nicht sicher, was ein Hash_Entry ist, aber Sie können Ihre eigene Art und leeren Wert über Templates leicht bereitzustellen.

Verwandte Themen