zhash_t in std::map konvertieren

English Deutsch

Problem:

Du hast eine Hash-Datenstruktur, die durch CZMQs zhash_t repräsentiert wird (siehe die zhash_t-Dokumentation für weitere Informationen).

Um sie in C++ bequemer verwenden zu können, beabsichtigst du, besagtes zhash_t in ein std::map<std::string, std::string> zu konvertieren.

Lösung

Dieses Beispiel geht davon aus, dass das zhash_t nur C-Strings als Schlüssel und Werte enthält. Wenn das nicht der Fall ist, kannst du das Beispiel unten an die spezifisch verwendeten Datenstrukturen anpassen.

Du kannst diese Utility-Funktion verwenden, die C++11 emplace-Semantik aus Effizienz- und Lesbarkeitsgründen nutzt:

zhash_to_map.cpp
/*
 * zhash_t -> std::map Konvertierungs-Utility
 * Geschrieben von Uli Koehler (techoverflow.net)
 * Veröffentlicht unter Public Domain
 */
#include <map>
#include <string>
#include <czmq.h>

/**
 * Konvertiert ein zhash in ein std::map
 * Vorbedingung (nicht geprüft): Jeder Schlüssel und Wert muss einen C-String repräsentieren
 */
inline std::map<std::string, std::string> zhashToMap(zhash_t* hash) {
    std::map<std::string, std::string> ret;
    zlist_t* headersKeys = zhash_keys (hash);
    for(char* key = (char*) zlist_first(headersKeys);
        key != NULL;
        key = (char*)zlist_next(headersKeys)) {
        char* value = (char*)zhash_lookup(hash, key);
        ret.emplace(key, value);
    }
    zlist_destroy(&headersKeys);
    return ret;
}

Wenn du kein C++11 verwenden kannst, ändere einfach ret-emplace(key, value); in Zeile 21 zu ret[std::string(key)] = std::string(value);.


Check out similar posts by category: C/C++