Ende eines zweidimensionalen vectors finden



  • Hi Leute,

    habe das Problem, was ich einem Beitrag gestern thematisiert habe geloest und nun habe ich noch ein einziges finales Problem. Ich will, nachdem ein vector (zweidimensional) durchsucht wurde und alle Werte fuer einen Suchparameter (alles double-Werte) in eine Datei geschrieben wurden, dann will ich eine Leerzeile einfuegen in der Datei und anschliessend nach dem naechsten Suchparameter suchen usw. .

    Das Problem ist die Leerzeile. Ich habe es wie folgt versucht:

    int z = 1;
    
      while(z <= NKPOINTS){
        for(i = 0; i < doub_buf_1.size(); i++){
          if(doub_buf_1[i].size() == 0) continue;
          if(doub_buf_1[i][0] == double(z)){
    	opf << doub_buf_1[i][1] << "  ";
    	if(i == doub_buf_1.size() - 1){
    	  opf<<endl;
    	}
          }
        }
        z++;
      }
    

    ohne Erfolg. Ich meine auch zu wissen, woran es liegt, naemlich an der if-Schleife:

    if(i == doub_buf_1.size() - 1){
      opf<<endl;
    }
    

    Ich denke das Problem ist, dass die Bedingung nicht erfuellt ist. Ich wollte damit testen, ob der zu untersuchende vector bereits fertig durchsucht wurde.

    Meine Frage ist nun:

    Wie kann ich testen, ob das Ende des zweidimensionalen vectors doub_buf_1 erreicht wurde?

    Ich hoffe, Ihr koennt mir weiterhelfen und nehmt mir evtl dumme Fragen nich uebel. Ich danke Euch.



  • Jemanden, der mit einer if-schleife programmiert, sollte das Problem nicht haben.

    Wie auch immer. Hast du es mal mit Iteratoren und doub_buf_1.end () versucht?



  • Hi drakon,

    also ich habe es mit doubl_buf_1.end() versucht, da kommt ein Fehler beim Kompilieren, weil er bei einem zweidimensionalen vector das irgendwie net kennt. Ich habe mich zwar mal an Iteratoren versucht, bin aber kläglich gescheitert.

    Bin also ziemlich ratlos



  • um was ist doubleBuffer bei dir? sowas wie

    vector<vector<Typ>> double_buf
    

    oder wie?



  • Genau es ist:

    vector<vector<double>> double_buf_1
    


  • naja das problem bei deinem code ist dass durch das continue wenn ein sub-vektor von doub_buf_l folgendes szenario möglich ist

    doub_buf_l size ist 3 (indices: 0,1,2)
    wenn der vektor der auf dem index 2 gespeichert ist eine size von 0 hat ist i = 2 -> das erste if liefert true (size == 0) und i wird erhöht, 3 < 3 ergibt false und er macht keine leerzeile

    wenn du also nach jedem suchparameter z (oder was auch immer) eine leerzeile haben willst dann tu es einfach in die äußere schleife

    vector<vector<double>> double_buf_1	
    
    for(int z = 1; z <= NKPOINTS; z++)
    {
        for(i = 0; i < doub_buf_1.size(); i++)
        {
            if(doub_buf_1[i].size() == 0)
                continue;
            if(doub_buf_1[i][0] == double(z))
            {
                opf << doub_buf_1[i][1] << "  ";
            }
        }
        opf << endl;
    }
    

    falls du, wenn mehrere vektor sets (innere vektoren) keine ergebnisse liefern nicht multiple leerzeilen haben willst setze einfach einen flag

    vector<vector<double>> double_buf_1	
    
    for(int z = 1; z <= NKPOINTS; z++)
    {
        bool oneOrMoreValuesMatched = false;
        for(i = 0; i < doub_buf_1.size(); i++)
        {
            if(doub_buf_1[i].size() == 0)
                continue;
            if(doub_buf_1[i][0] == double(z))
            {
                oneOrMoreValuesMatched = true;
                opf << doub_buf_1[i][1] << "  ";
            }
        }
        if(oneOrMoreValuesMatched)
            opf << endl;
    }
    

    und wenn du einen iterator verwenden willst

    vector<vector<double>> double_buf_1	
    
    for(int z = 1; z <= NKPOINTS; z++)
    {
        bool oneOrMoreValuesMatched = false;
        for(vector<vector<double>>::iterator i = doub_buf_1.begin(); 
            i != doub_buf_1.end(); ++i)
        {
            if((*i).size() == 0)
                continue;
            if((*i)[0] == double(z))
            {
                oneOrMoreValuesMatched = true;
                opf << (*i)[1] << "  ";
            }
        }
        if(oneOrMoreValuesMatched)
            opf << endl;
    }
    

    ich hab das jetzt nicht kompiliert aber selbst wenn irgend n fehler drin ist sollts dir irgendwie nen denkanstoß geben

    und: OMFG nenn die variablen irgendwie nicht-scheiße - z, doub_buf_l und NKPOINTS sind absolut nichtssagend und schlecht gewählte namen



  • @Vevusio: Danke für Deine hilfreichen Tipps, aber die Variablen haben für meine Zwecke exakt die passenden Namen. Du magst den Hintergrund nich kennen, vllt auch nicht verstehen, aber die sind angepaßt und für Leute, die wissen, was ich mache, bzw. die das Gleiche machen, vollkommen instruktiv. Deswegen danke ich Dir sehr für Deine Hilfe allerdings, aber bitte schreib anderen dann nix vor, von dem Du keine Ahnung hast.



  • aber bitte schreib anderen dann nix vor, von dem Du keine Ahnung hast.

    Also einem, der dir sich so Zeit nimmt dir zu helfen, solltest du ein wenig mehr Respekt zeigen. Es war ein VORSCHLAG und er schreibt dir nichts vor.
    Die Variablen sind nichtssagend. Das ist Tatsache. Klar, wenn man es jemanden sagt, was sie bedeuten, ist es klar, aber für andere, die den Code lesen ist das nicht offensichtlich.



  • Hi Drakon,

    den Respekt habe ich ihm mit meinem Dank erwiesen und die Bedeutung von z.B. NKPOINTS ist jenseits des Codes zugänglich, es ist die Anzahl der Punkte innerhalb der Brillouin-Zone im reziproken Raum und nominell an den Code, den ich für numerische Kalkulationen nutze, angepaßt. Im übrigen impliziert ein Imperativ einen Befehl: "nenn" ist ein Imperativ also kein Vorschlag sondern ein Befehl.



  • Ich habe jetzt eher double_buf_1 gemeint. 😉

    Also wenn du auf solche Spitzfindigkeiten schaust.. 🙄
    Wenn ich einen Beitrag schreibe, dann schaue ich nicht nochmal alles durch, ob man etwas eventuell falsch verstehen könnte. (Sind ja nur wenige Frauen hier. 😉 - aber das ist jetzt eine andere Diskussion.)



  • Sry aber aber ich habs in dem Moment nich als Spitzfindigkeit gesehen. Wenn nur das Wörtchen bitte als Ausdruck der Verzweiflung, weil mein Code so unverständlich ist, dabei gewesen wäre, dann hätte ich mich net so dran aufgehängt. Aber das nächste Mal stelle ich Code rein, der von dem Variablennamen so abgeändert wurde, daß offensichtlich is, was gemeint ist. Ich benenne halt alle meine puffer als _buf . Das is ein Zwischenprodukt und hat mit dem Ergebnis nix zu tun.

    Sry, wenn ich etwas rauh war.


Anmelden zum Antworten