Globalen vector-Index in lokalen umwandeln



  • Hallo,

    ich würde gerne folgende Implementierung etwas anpassen:

    static bool getLocalIndex( int& outer_index, int& inner_index, const std::vector<std::vector<int>>& vecs, int globalIndex )
    {
      inner_index = globalIndex;
      outer_index = 0;
    
      int cur_size = vecs[outer_index].size();
      while( inner_index >= cur_size )
      {
        outer_index++;
        if( outer_index >= vecs.size() )
          return false;
    
        cur_size = vecs[outer_index].size();
        inner_index -= cur_size;
      }
    
      return inner_index >= 0;
    }
    

    Ich habe einen Vektor aus int-Vektoren samt globalem Index. Enthält der äußere Vektor 2 Vektoren zu je 5 und 10 Elementen, kann ich diesen global von 0 bis 14 indizieren und suche zu diesen globalen Indizes den lokalen Index der Einzelvektoren.
    Auf dem obigen Vektor soll meine Funktion also folgendes tun:

    int outer, int inner;
    getLocalIndex( outer, inner, vec, 3)
    // outer = 0, inner = 3

    int outer, int inner;
    getLocalIndex( outer, inner, vec, 7)
    // outer = 1, inner = 2

    int outer, int inner;
    getLocalIndex( outer, inner, vec, 17)
    // out of range error
    // outer = ?, inner = ?

    Was mich stört:

    1. Argumente per Referenz zu übergeben, die von einer Methode "ausgefüllt" werden, finde ich grundsätzlich eher hässlich. Zum einen ist es schwer zu erkennen, was Input- und was Output-Argument ist, zum anderen muss man vorm call lokale Variablen anlegen, die möglicherweise gar nicht gebraucht werden. Ich will lieber ein pair oder struct als return-Argument.

    2. Damit brauche ich natürlich eine andere Möglichkeit, den Fehler zurückzugeben. Bietet sich hier eine Exception an?

    3. Kann man den Algorithmus noch insgesamt verbessern? Eine while-Schleife und das multiple Branching erscheint mir noch verbesserungswürdig. Gibts dafür vielleicht sogar was in der std lib?



  • Hallo,

    1. Ich bin da zwar selber kein Fan von, aber viele scheinen für sowas gerne std:tuple zu nehmen.

    2. Exception halte ich für falsch, mit 1) auch überflüssig, da Rückgabewert im Tuple

    3. Keine Ahnung



  • 3( evtl an npos denken und behaupten, da- da gar keine Fehler auftreten l;nnen.



  • Jockelx schrieb:

    1. Ich bin da zwar selber kein Fan von, aber viele scheinen für sowas gerne std:tuple zu nehmen.

    Joa, kann man machen. Du meinst dann std::tuple<bool, int, int> ? Finde ich zwar auch noch nicht perfekt, da bool und return-Werte jetzt wieder gleichgestellt werden, was sie aber per se nicht sind, aber ist allemal besser als die Referenz-Parameter.

    Jockelx schrieb:

    1. Exception halte ich für falsch, mit 1) auch überflüssig, da Rückgabewert im Tuple

    Warum? Ist es kein Ausnahmefall, wenn out-of-bounds auf einen Vektor zugegriffen wird?
    Man hat hier auch den unschlagbaren Vorteil, dass eigentliche return-Werte und ein "Fehler-Return" ganz klar unterschieden werden.

    Jockelx schrieb:

    3( evtl an npos denken und behaupten, da- da gar keine Fehler auftreten l;nnen.

    Wie meinen? 😃



  • banshee schrieb:

    Warum? Ist es kein Ausnahmefall, wenn out-of-bounds auf einen Vektor zugegriffen wird?

    Ich hatte das so gelesen: "Ich weiss nicht, wie das mit dem Rückgabewert machen soll, deshalb mach es jetzt als Exception".
    Ob die Funktion eher so eine Suchfunktion sein soll, die auch mal nix findet oder stets einen Index (ausser in Ausnahmefällen) zurückgeben soll, weisst du besser als ich.


Anmelden zum Antworten