C++ Äquivalent zu C# List.Contains aus der wxWidgets Library



  • Guten Tag,

    wie der Titel bereits sagt, würde ich gerne wissen was das C++ Äquivalent zu C# List.Contains ist. Falls möglich hätte ich gerne das Äquivalent aus der wxWidgets Library. Ich hoffe ihr könnt mir helfen.

    Mit freundlichen Grüßen,
    DarkBug


  • Mod

    Also die wx Container solltest du eher meiden, schau dir mal die STL Varianten an, da wäre es dann std::find + Container.



  • Danke für deine Antwort. Warum sollte ich die wxWidgets Container meiden? Sobald ich andere Funktionen als die aus der wxWidgets Library benutze, ist das Programm doch nicht mehr Betriebssystemübergreifend oder nicht?



  • phlox81 schrieb:

    Also die wx Container solltest du eher meiden, schau dir mal die STL Varianten an, da wäre es dann std::find + Container.

    Möp, wenn man einen modernen Compiler benutzt, also nicht VC6 :D, dann sind die wxWidgets Container seit Version 2.9.x std::vector.
    Gibt keinen Grund mehr, die zu meiden :). Sind im prinzip std::vector nur eben mit etwas mehr Funktionen für Kompatibilität mit älteren Funktionen.

    DarkBug schrieb:

    Danke für deine Antwort. Warum sollte ich die wxWidgets Container meiden? Sobald ich andere Funktionen als die aus der wxWidgets Library benutze, ist das Programm doch nicht mehr Betriebssystemübergreifend oder nicht?

    Jein, im Fall von std::vector trifft das nicht zu, weil es zum Umfang von C++ gehört und der ist auf fast jeder Platform gleich (gibt wenige Ausnahmen wie embedded Systeme die eine eigene Bibliothek haben).



  • Wenn ich mit meinem Programm Windows, Linux und Mac erreichen möchte, kann ich dann jegliche Funktionalität aus dem Namespace std verwenden?

    boost::tuple läuft nur unter Windows oder?



  • Ja, kannst du.
    Das mit boost::tuple würde ich jetzt bezweifeln. Wäre mir neu dass das nur unter windows geht.


  • Mod

    Scorcher24 schrieb:

    phlox81 schrieb:

    Also die wx Container solltest du eher meiden, schau dir mal die STL Varianten an, da wäre es dann std::find + Container.

    Möp, wenn man einen modernen Compiler benutzt, also nicht VC6 :D, dann sind die wxWidgets Container seit Version 2.9.x std::vector.
    Gibt keinen Grund mehr, die zu meiden :). Sind im prinzip std::vector nur eben mit etwas mehr Funktionen für Kompatibilität mit älteren Funktionen.

    Oh, wusste ich nicht, aber nutze selber noch 2.8.x.
    Auch ist es wohl besser, wenn man die Container auf dem Standard belässt, als das man sie aus dem Framework benutzt.



  • @Scorcher24: Stimmt, mein Fehler. Die Boost C++ Libraries gibt es sowohl für Windows, als auch für Linux und Mac OS.

    Ich würde gerne tuples benutzen, jedoch scheint es da drei verschiedene Arten von zu geben, die alle genau das gleiche können:

    #include <boost/tuple/tuple.hpp> //boost::tuple
    #include <tr1/tuple> //std::tr1::tuple C++0x
    #include <tuple> //std::tuple

    Welche Art sollte ich nehmen?

    @phlox81: Ich glaube std::find ist nicht das, was ich suche. Ich möchte folgenden C# Vorgang in C++ machen:

    List<string> DistinctList = new List<string>();
    
    string[] InputCsvContent = File.ReadAllLines(InputCsvFilePath, System.Text.Encoding.Default);
    
    foreach (string InputCsvLine in InputCsvContent)
    {
        if (!DistinctList.Contains(InputCsvLine))
        {
            DistinctList.Add(InputCsvLine);
        }
    }
    
    File.WriteAllLines(OutputCsvFilePath, DistinctList.ToArray(), System.Text.Encoding.Default);
    


  • DarkBug schrieb:

    Welche Art sollte ich nehmen?

    Das hängt davon ab, welche Compiler Dir auf den Plattformen zur Verfügung stehen und welche Version des C++-Standards diese unterstützen:

    #include <boost/tuple/tuple.hpp> //boost::tuple
    Funktioniert mit allen C++-Compilern, die den C++98 Standard unterstützen, erfordern aber die Installation von boost.

    #include <tr1/tuple> //std::tr1::tuple C++0x
    Funktioniert nur mit Compilern, die den C++98 Standard mit den TR1-Erweiterungen (zumindest tlw.) unterstützen

    #include <tuple> //std::tuple
    Funktioniert nur mit Compilern, die den C++0x Standard (zumindest tlw.) unterstützen

    Idealerweise solltest Du natürlich die Variante wählen, die auf allen drei Plattformen funktioniert (kleinster gemeinsamer Nenner).



  • DarkBug schrieb:

    List<string> DistinctList = new List<string>();
    
    string[] InputCsvContent = File.ReadAllLines(InputCsvFilePath, System.Text.Encoding.Default);
    
    foreach (string InputCsvLine in InputCsvContent)
    {
        if (!DistinctList.Contains(InputCsvLine))
        {
            DistinctList.Add(InputCsvLine);
        }
    }
    
    File.WriteAllLines(OutputCsvFilePath, DistinctList.ToArray(), System.Text.Encoding.Default);
    

    Für sowas nutzt man ein Set, auch in C#!
    C#: http://msdn.microsoft.com/en-us/library/bb359438.aspx
    C++: http://en.cppreference.com/w/cpp/container/set

    Gut Schuß
    VuuRWerK 😉



  • LordJaxom schrieb:

    Idealerweise solltest Du natürlich die Variante wählen, die auf allen drei Plattformen funktioniert (kleinster gemeinsamer Nenner).

    Dann werde ich boost::tuple verwenden, denn die Boost C++ Libraries gibt es ja sowohl für Windows, als auch für Linux und Mac OS. Und da jeder C++ Compiler den C++98 Standard unterstützt, wäre dies der kleinste gemeinsame Nenner. Außerdem bieten die Boost C++ Libraries ja auch noch viele weitere nützliche Funktionen.

    @VuuRWerK: Wie stellst du dir denn diesen Vorgang in C++ mit einem Set vor? Magst du mal einen Quelltext posten?



  • std::vector< std::string > inputCSVLines = ...;
    std::set< std::string > distinctList( inputCSVLines.begin(), inputCSVLines.end() );
    

    Gut Schuß
    VuuRWerK 😉


Anmelden zum Antworten