.NET Dictionary in C++ verwenden



  • Hallo,

    ich muss gerade im Rahmen meines Studiums ein bestehendes Projekt, welches in C++ geschrieben ist um einige Funktionen erweitern.
    Für eine Problem würde es sich anbieten Hash Tabellen zu verwenden.
    Von C# her kenne ich die Collection "Dictionary", die für mein momentanes Problem perfekt wäre. Habe jetzt mal bei msdn nachgeschaut und gesehen, dass es sowas auch für C++ gibt: http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
    Könnte mir von euch vielleicht einer erklären, wie ich in einem bestehenden Projekt in dem noch keine .NET Library eingebunden ist eine Dictionary verwende.

    Vielen Dank schon mal im Voraus

    Grüße
    Rafter



  • Wenn ich dich richtig verstanden habe, möchtest du einen Dictionary-Container ohne .Net Unterstützung verwenden.

    Versuchs mal mit:

    #include <map>
    

    Ist das Gleiche wie der Dictionary^^

    Mfg



  • Hi,

    vielen Dank für die super schnelle Antwort.

    Hab mir jetzt mal ein paar Sachen zu maps durchgelesen und an sich bietet mir eine map genau die Funktionen die ich brauche.
    Leider habe ich auch gelesen, dass eine map beim Finden von Einträgen nicht ganz so schnell sein soll wie ein Dictionary.

    Daher aus Interesse doch noch die Frage ob es möglich ist in einem bestehenden Projekt, das noch keine .NET Library verwendet, ein .NET Dictionary zu verwenden, ohne das ich am bestehenden Code viel ändern muss?

    Falls ja wäre es nett wenn mir jemand ganz kurz die notwendigen Schritte dazu erklären könnte.
    Falls nein werd ich wohl eine map verwenden.

    Vielen Dank schon mal.



  • Daher aus Interesse doch noch die Frage ob es möglich ist in einem bestehenden Projekt, das noch keine .NET Library verwendet, ein .NET Dictionary zu verwenden, ohne das ich am bestehenden Code viel ändern muss?

    Nein.



  • Das kommt ganz darauf an, was du in deinem bestehendem Projekt alles verwendest.

    Versuch mal das ganze in C++/CLI (unter Eigenschaften -> Allgemein -> Common Language Runtime-Untestützung auf /clr) zu erstellen und schau dir die Fehlermeldungen an. Wenn es reines C++ ist, dann dürfte eigentlich nicht viel schief gehen. Dann kannst Du im Prinzip die Dictionary schon verwenden.

    Wenn Du z.B. die Boost Libraries in deinem Projekt verwendest, bekommst du massenweise Fehlermeldungen. Dann ist es besser, gleich eine map zu verwenden. Boost verträgt sich nicht so gut mit C++/CLI.



  • Es ist Unsinn in einem native C++ Projekt ein managed Dictionary zu verwenden.
    Simon



  • Warum soll das generell so sein? Es ist eine Aufgabe im Studium, die nicht an irgendwelchen Rahmenkriterien gebunden ist und wenn er unbedingt eine Dictionary verwenden will, warum nicht?



  • theta könntest du mir erklären, wieso es deiner Meinung nach Unsinn ist in einem nativen C++ Projekt ein managed Dictionary zu verwenden?

    So wie ich das gelesen habe, verwendet map nicht wirklich eine Hash Tabelle und ist deshalb auch nicht so schnell.
    Gibt es eine Alternative zu map, die wie ein Dictionary wirklich eine Hash Tabelle verwendet?

    Finde es echt klasse, wie schnell einem hier im Forum geantwortet und geholfen wird. Danke!



  • theta könntest du mir erklären, wieso es deiner Meinung nach Unsinn ist in einem nativen C++ Projekt ein managed Dictionary zu verwenden?

    1. Es ergeben sich Probleme bezüglich Integration zwischen managed und native Code.
    2. Es ergeben sich Performance Einbussen wegen der managed / native Transitions.
    3. Du schaffst Dir eine zusätzliche Abhängigkeit (zu .NET).

    Ich weiss, alle Punkte sind lösbar, doch wozu sich die Mühe machen etwas passend zu machen was nicht von Haus aus passt und mehr Bezahlen als nötig?

    So wie ich das gelesen habe, verwendet map nicht wirklich eine Hash Tabelle und ist deshalb auch nicht so schnell.
    Gibt es eine Alternative zu map, die wie ein Dictionary wirklich eine Hash Tabelle verwendet?

    Alternativen sind die unordered maps von boost und die tr1 impl. von microsoft. Soviel ich weis hat auch SGI hash maps.
    http://msdn.microsoft.com/en-us/library/bb983026.aspx
    http://www.boost.org/doc/libs/1_39_0/doc/html/unordered.html

    Ausserdem würde ich erst messen. Wenn Du feststellst, dass dein Bottleneck wirklich die std::map ist, dann kannst Du ja Alternativen ausprobieren.

    Simon



  • Also ich bin auch eingentlich noch ziemlicher Anfänger, aber ich würde nicht sooo sehr auf die Geschwindigkeit achten. Meistens sind das Unterschiede, die du ohne Messungen kaum wahrnimmst. Muss jeder aber für sich entscheiden, wollte das nur mal kurz einwerfen 😃



  • Hab mich jetzt dazu entschlossen das Ganze zunächst mit einer map zu versuchen.
    Werde den Zugriff auf die map jedoch mit Hilfe einer Klasse kapseln, damit ich fest definierte Schnittstellen habe.
    Sollte ich dann später merken, dass die map doch zu langsam ist werd ich sie durch eine unordered_map aus der boost Library ersetzen.

    Nochmal vielen Dank an alle für eure Hilfe.


Anmelden zum Antworten