tripel



  • Hi,

    ich bräuchte eigentlich ein pair mit 3 Werten, also quasi ein tripel, welches es ja aber leider nicht zu geben scheint...
    Kennt Ihr da etwas anderes für, oder kann man 2 pair irgendwie ineinander verschachteln? Und wie würde das dann aussehen, bzw., wie spräche man dann die einzelnen Teile an?

    MfG, und vielen Dank im Voraus, Ozzy



  • wenn du ne neuere stl version benutzt, kannst du std::tr1::tuple nutzen. ansonsten funktioniert auch boost::tuple(ist im großen und ganzen dasselbe).

    wenn dir das nicht reicht, musst du dir wohl oder übel was eigenes schreiben



  • Hi,

    irgendwie muss ich zugeben, dass mir das nicht so ganz gefällt... Ich habe bisher auch nichts gefunden, wie ich da etwas einfügen kann (wenn z.B. ein array im Tupel steht).

    Geht so etwas nicht auch irgendwie mit einem pair, wo noch ein pair drin steht?

    MfG, Ozzy



  • Hallo

    Du kannst pai auch schachteln

    std::pair<int, std::pair<int, int> > Tripe;
    Tripe.first = 1;
    Tripe.second.first = 2;
    Tripe.second.second = 3;
    

    Ob das aber wirklich die bessere Lösung als die genannten dedizierten Tuples, ist geschmackssache.

    bis bald
    akari



  • Ozzy schrieb:

    irgendwie muss ich zugeben, dass mir das nicht so ganz gefällt... Ich habe bisher auch nichts gefunden, wie ich da etwas einfügen kann (wenn z.B. ein array im Tupel steht).

    Wo ist das Problem? Klappt bei mir wunderbar:

    boost::tuples::tuple< int, int, vector<int> > x(23, 42, vector<int>());
    x.get<2>().push_back(1);
    
    vector<int> a = x.get<2>();
    cout << a[0] << endl; // Ausgabe: 1
    


  • Ok, wenn ich das mit einem Tuple mache, dann schaffe ich es gerade trotzdem nicht, ein Element ins array zu schreiben...

    tr1::tuple< <int>[2250], bool, bool > tup;
    tup.get<0>[0] = 1;
    

    Könnt Ihr mir da noch einmal helfen?

    MfG, Ozzy



  • Mach die spitzen Klammern um das 'int' in der Tuple-Deklaration weg.



  • Nö, also daran lag es nicht.
    Der Compiler meldet:
    expected primary-expression before >>[<< token

    Hast Du vielleicht noch eine Idee?



  • Ozzy schrieb:

    Hast Du vielleicht noch eine Idee?

    Joar, ganz übersehen. 'get' ist ein Methodenaufruf (wie in meinem Beispiel auch!). Also: Runde Klammern hinter. Die spitzen Klammern um das 'int' waren aber trotzdem falsch.



  • Ne, also das klappt immer noch nicht! Ich verstehe das einfach nicht... Vielleicht wäre pair ja doch einfacher...

    Kannst Du sonst vielleicht noch einmal schreiben, wie das dann richtig heißen müsste? also mit dem get?

    MfG, Ozzy



  • Ozzy schrieb:

    Ne, also das klappt immer noch nicht! Ich verstehe das einfach nicht...

    So schwer sollte das aber eigentlich nicht sein. Zeig doch bitte mal den relevanten Code (oder ein Minimalbeispiel), bei dem es nicht klappt.



  • Hi,

    das hatte ich doch vorhin gemacht. Ich habe nur noch das "()" hinzugefügt...



  • Ozzy schrieb:

    das hatte ich doch vorhin gemacht. Ich habe nur noch das "()" hinzugefügt...

    Code, bitte ...

    Wenn Du es genauso gemacht hättest wie ich gesagt habe, dann würde es ja funktionieren.



  • tr1::tuple<int[2250], bool, bool> tup;
    tup.get<0>()[0]=1;
    


  • Merde. Mein Fehler, sorry. Ich habe mit Boost getestet und dachte, TR1 wird wohl genauso sein (ich habe keine TR1-Header). Nach einem Blick in Dinkumwares Doku scheint es so, als gäbe es keine Memberfunktion 'get'. Versuch mal folgenden Code. Wenn der nicht funktioniert, rate ich zu Boost:

    tr1::tuple<int[2250], bool, bool> tup;
    get<0>(tup)[0]=1;
    


  • Kein Problem.

    Das hatte ich aber auch schon ausprobiert - ohne Erfolg. Ich bin jetzt doch bei einem verschachtelten pair gelandet, mir rennt sonst einfach die Zeit davon.

    Trotzdem noch einmal vielen Dank für Deine Mühen!!!

    MfG, Ozzy


  • Mod

    Konrad Rudolph schrieb:

    Merde. Mein Fehler, sorry. Ich habe mit Boost getestet und dachte, TR1 wird wohl genauso sein (ich habe keine TR1-Header). Nach einem Blick in Dinkumwares Doku scheint es so, als gäbe es keine Memberfunktion 'get'. Versuch mal folgenden Code. Wenn der nicht funktioniert, rate ich zu Boost:

    tr1::tuple<int[2250], bool, bool> tup;
    get<0>(tup)[0]=1;
    

    ISO/IEC TR 19768: C++ Library Extensions TR1 - Draft
    Hier ist auch der Grund beschrieben, weshalb get nicht als Memberfunktion deklariert ist.

    [Note: The reason get is a nonmember function is that if this functionality had been provided as a member function, invocations where the type depended on a template parameter would have required using the template keyword. —end note]


Log in to reply