Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Anfängerfrage zu vector

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
14.09.2018, 08:17 Uhr
bakoll



Ich habe folgende Funktion


C++:
void printChain(const std::vector<bool>& chain){
    cout<<nr<<" ";
    std::vector<bool>inhalt;
    for (bool b : chain){
        printf((b)? "W" : "B");
        inhalt.push_back(((b)? "W" : "B"));
    }
    cout<<" inhalt: ";
    for(auto it = inhalt.begin(); it != inhalt.end();it++)
    {
        std::cout<<""<< *it<<" "; // Hier spuckt er aus
    }

    nr++;
    printf("\n");
}



Ausdruck: 246 BBBWBBWWWW inhalt: 1 1 1 1 1 1 1 1 1 1

Ich bin Programmier-Anfänger (C++ 11), habe diese Funktion im Netz erhalten, und nun den Vector inhalt eingesetzt.

Ich vertsteh in der Funktion da For nicht: for (bool b : chain) Bei mir sieht For in C++ 11 immer so aus: for (Beginn;Grenze;Schritt)
Ich versteh auch nicht, warum da ein printf ist, das ist doch C, und nicht C++, oder?
Und den Ausdruck hinter ((b)? "W" : "B") versteh ich auch nicht.... Was meint der?


Ich möchte, daß in den Vector inhalt, folgendes hineingepackt wird, wenn ein B im B-W-Code davor steht, solll eine Null im Vector inhalt erscheinen, wenn ein W an der Stelle im B-W-Code davor steht, soll die Nr. der Stelle erscheinen.

Beispiel:
Der Code BBBWBBWWWW soll im Vector als 00040078910 erscheinen.

Wie erreiche ich, daß ich auf diesen Vector auch im main-Programm zugreifen kann?

Dieser Post wurde am 14.09.2018 um 08:35 Uhr von bakoll editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.10.2018, 16:47 Uhr
ITWorks4U



Nun, da sich noch keiner dazu geäußert hat, mach ich das mal. ;-)

C++:
    for (bool b : chain){
        /*        ...        */
    }


Ab C++14, wenn ich mich nicht irre, gibt es die foreach-Schleife. Diese ist besonders bei Programmiersprachen, wie Java und C# vorhanden und wird verwendet, um ein Array, ein Feld, Vektor, ... komplett durchlaufen zu lassen, ohne überhaupt sich darüber einen Kopf zu machen, wie viele Elemente vorhanden sind.

printf() ist zwar in C beheimatet, kann aber auch unter C++ problemlos verwendet werden. Es muss also nicht unbedingt cout << ... << endl;
da stehen.

Zitat von bakoll:
Und den Ausdruck hinter ((b)? "W" : "B") versteh ich auch nicht.... Was meint der?

Das ist die Kurzschreibweise für:

C++:
    bool b = chain.at(i);
    if (b == true) {
        printf("W");
       /*    cout << "W" << endl; Kann auch verwendet werden.    */
    } else {
        printf("B");
    }

    inhalt.push_back(((b)? "W" : "B"));


Im Anschluss wird auf den Vektor "inhalt" an der Position i ein "W" oder "B" hinzugefügt, je nachdem, ob b wahr oder falsch war.

Zitat von bakoll:

Ich möchte, daß in den Vector inhalt, folgendes hineingepackt wird, wenn ein B im B-W-Code davor steht, solll eine Null im Vector inhalt erscheinen, wenn ein W an der Stelle im B-W-Code davor steht, soll die Nr. der Stelle erscheinen.

Beispiel:
Der Code BBBWBBWWWW soll im Vector als 00040078910 erscheinen.


So ganz nebenbei: Es wurde ein Vektor vom Typ bool erstellt, aber Strings, in dem Fall Wörter der Länge 1, wurden hier eingefügt. Jeder Compiler würde spätestens hier die Arbeit verweigern. ;-)
Modifizieren wir das mal, wobei die längere Schreibweise für ein besseres Verständnis hier verwendet wurde:

C++:
    std::vector<int> getChainContent(const std::vector<bool> &chain) {

    std::vector<int>content;
   /*    Wir wollen 0 für "B" und ansonsten Position i für "W" haben, daher eine natürliche Zahl.    */
                            
    /*    alternativ auch: for (bool b : chain) { ... }    */
    for (int i = 0; i < chain.size(); i++) {            
        bool b = chain.at(i);

        if (b == true) {
            /*    für jedes "B" wird eine 0 eingetragen    */
            inhalt.push_back(0);            
        } else {
            /*    sonst Position i für jedes "W"            */
            inhalt.push_back(i);                        
        }        
    }

   /*    ... damit man diesen Vektor auch noch woanders verwenden kann    */
    return content;                                        
}



Anmerkung: Ich habe mir im Übrigen erlaubt den Schritt zu überspringen, dass aus dem Resultat von b[i] ein "B", sonst ein "W" zu machen, da wir hier nicht drei Vektoren brauchen und nur eins zurück geben. Der übergebene Vektor chain im Parameter wird nur zum Auslesen verwendet und macht nichts weiter. Wir brauchen somit keinen vector<String> zum Aufbewahren von "B" oder "W", sondern nehmen gleich einen vector<int>, da wir ja an der Position[i] eine 0 oder i eintragen und diesen wiederum an den Benutzer zurück geben.

¤: Hab den Code jetzt auch mal frei Schnauze zusammen gebastelt. Sollte aber funktionieren. ;-)
--
Programmierrezepte frei Haus!

Dieser Post wurde am 16.10.2018 um 16:55 Uhr von ITWorks4U editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: