Container Eintrag
-
Hallo,
ich möchte, daß in eine Zahlenliste in einem vector-Container eine Zahl nur dann mit push.back eingetragen wird, wenn sie dort noch nicht vorhanden ist.
Wie kann ich das machen?
Die if-Struktur stellt kein Problem für mich da, nur wie die If-Struktur den Inhalt des Containers prüft ....
Danke
-
if ( std::find(std::begin(vec), std::end(vec), myX) == std::end(vec) ) vec.push_back(myX);
-
Danke, probier es gleich mal aus ....
-
PS: Normalerweise bietet sich für sowas std::set an.
-
funktioniert übrigens prima!
Kannst Du mir mal verraten, warum Du vor die Befehle dieses std:: machst? Ich kenn den Befehl nicht.
-
brak schrieb:
funktioniert übrigens prima!
Kannst Du mir mal verraten, warum Du vor die Befehle dieses std:: machst? Ich kenn den Befehl nicht.
muss man hinschreiben, denn diese klassentemplates / funktionstemplates sind im namensbereich std.
-
Es sei denn man ist böse und schreibt using namespace std;.
Aber zum Glück würde man dass ja niemals machen.
-
Nathan schrieb:
Es sei denn man ist böse und schreibt using namespace std;.
Aber zum Glück würde man dass ja niemals machen.das heißt konkret, wenn ich using namespace std deklariert habe im haeder oben, kann ich alle std:: entfernen aus dem Text, oder?
-
Ja.
-
brak schrieb:
das heißt konkret, wenn ich using namespace std deklariert habe im haeder oben, kann ich alle std:: entfernen aus dem Text, oder?
theoretisch ja, aber in einem Header hat das nichts zu suchen. Wenn du diese Headerdatei irgendwoanders einbindest, dann ist dort nämlich auch der Namensraum std "frei". Und das wollen erfahrene Programmierer nicht, weil es zu Namenskollisionen kommen kann.
-
Das wollen auch unerfahrene Programmierer nicht. Es hebelt halt das gesamte Konzept von Namensräumen aus.
-
Skym0sh0 schrieb:
Es hebelt halt das gesamte Konzept von Namensräumen aus.
Das stimmt so nicht. Im Falle einer Kollision kann man den Namensraum auch einfach explizit angeben.
Skym0sh0 schrieb:
Es hebelt halt das gesamte Konzept von Namensräumen aus.
Unerfahrene Programmierer wollen das. Bjarnes std_lib_facilities.h hat ein "using namespace std;" drin.
-
Das Progrämmchen läuft, ist wohl nicht nach der reinen Lehre notiert, aber es läuft ....
Der fragliche Code ist beim einzigen find. dort hätt ich gerne die std's raus.
Jetzt noch was. Ich möchte, daß in der letzten Liste, wo die existenten Teilersummen aufgeführt werden, hinter jeder Zeilersumme alle die Zahlen erscheinen, wie diese Zahl Teilersumme ist. Wie mach ich das am besten?
Ich will also an die Elemente von Teilersummensammler hinten eine offen Schlange von Elementen anheften lassen. Das passiert bei hinter bei dem If und danach in einem noch zu setzenden else...
#include <iostream> #include <vector> using namespace std; int quot; int Testzahl=0; int Testbeginn; int Testende; int Zehler=0; int PrimZahlZeler=0; int Teilerzeler=0; int NichtTrivialeTeilerSumme=0; int TeilerSumme=0; //Teilersumme vector<int>Teiler(0); vector<int>TeilerSummenSammler(0); vector<int>newsort(0); //vector<int>NTTS(0); //NichttrivialeTeilersumme int main () { cout<< "Geben Sie die Anfangszahl des Bereiches ein: "; cin>>Testbeginn; cout<< "Geben Sie die Endzahl des Bereiches ein: "; cin>>Testende; for(int a=Testbeginn;a<=Testende;a++) { Testzahl=a; for(int i=1;i<=Testzahl;i=i+1) { quot=Testzahl/i; if(0==Testzahl%i) { quot=Testzahl/i; Zehler=Zehler+1; Teiler.push_back(quot); //cout<<" "<<quot <<" ist der "<<Zehler<<". Teiler der Zahl "<<Testzahl<<". \n"; TeilerSumme=TeilerSumme+quot; } } if (Teiler.size()==2) { cout<<Testzahl<<" (prim) \n"; PrimZahlZeler++; } else if (Teiler.size()!=2) { cout<<Testzahl<<" - "<<Zehler<<" T. "; for(auto it=Teiler.begin();it!=Teiler.end();it++) { cout<<*it; if( it!=Teiler.end()-1 ) cout<<"+"; } NichtTrivialeTeilerSumme=TeilerSumme-Testzahl-1; cout<<"= "<<TeilerSumme<<"=TS,"<<NichtTrivialeTeilerSumme<<"=NTTS.\n"; if ( std::find(std::begin(TeilerSummenSammler), std::end(TeilerSummenSammler), TeilerSumme) == std::end(TeilerSummenSammler) ) { TeilerSummenSammler.push_back(TeilerSumme); } } TeilerSumme=0; Teiler.clear(); Zehler=0; } std: sort(TeilerSummenSammler.begin(),TeilerSummenSammler.end()); cout<<"Dies sind die existenten Teilersummen des Bereiches bis "<<Testende<< endl; for(auto it=TeilerSummenSammler.begin();it!=TeilerSummenSammler.end();it++) { Teilerzeler=Teilerzeler+1; cout<<Teilerzeler<<". "<<*it; cout<<" "<<endl; } cout<<"Es gibt im Bereich von "<<Testbeginn<<" bis "<<Testende<<" genau "<<PrimZahlZeler<<" PrimZahlen und " <<Teilerzeler<<" verschiedene Teilersummen."; return (0); }
-
Ist nicht so guter Code. Allein schon von der Formatierung her nicht.
1. Vermeide Globale Variablen, zumal du sie hier eh nicht brauchst.
2. Zeile 77: "std: sort"... Das ist nicht so ganz korrekt.
3. Zeile 4 hat die namespace Direktive, wieso dann "std::" nochmal explizit angeben?
4. Wenn du keine doppelten Einträge haben willst, dann nimm doch gleich std::set, statt vector.
5. ich versteh wegen unglücklicher Formulierung deine Frage nicht/bzgl. Teilersummen)
-
Skym0sh0 schrieb:
1. Vermeide Globale Variablen, zumal du sie hier eh nicht brauchst.
Was sind "globale Variablen"? Ich vermute, Du meinst die int-Variablen im Haeder?
Skym0sh0 schrieb:
2. Zeile 77: "std: sort"... Das ist nicht so ganz korrekt.
Hab ich gelöscht, jetzt funktioniert es so.
Skym0sh0 schrieb:
3. Zeile 4 hat die namespace Direktive, wieso dann "std::" nochmal explizit angeben?
Aha, wenn "Using namespace std:" steht, braucht in den Code das std nicht mehr ein. Hab ich das recht verstanden?
Skym0sh0 schrieb:
4. Wenn du keine doppelten Einträge haben willst, dann nimm doch gleich std::set, statt vector.
Den Befehl kenn ich überhaupt nicht, steht auch in meinem c++ Heft nicht drin, glaub ich...
Skym0sh0 schrieb:
5. ich versteh wegen unglücklicher Formulierung deine Frage nicht/bzgl. Teilersummen)
Laß den Code mal laufen. Er zeigt am Ende eine Liste von Zahlen, die in dem eingegebenen Bereich als Teilersummen auftreten. Ich möchte jetzt noch, daß hinter den Zahlen(Teilersummen) angegeben wird, bei welchen Zahlen diese Teilersummen auftreten. Es müßte nach dem if Zeile 71 eingebaut werden.
Bei dem Find-Befehl, kann ich da einfach die std's mit den beiden Doppelpunkten rauslöschen?
Danke für die Hilfestellung!:-)
-
Was sind "globale Variablen"?
Variablen, die global deklariert wurden, also außerhalb einer Funktion oder Klasse.
Aha, wenn "Using namespace std:" steht, braucht in den Code das std nicht mehr ein. Hab ich das recht verstanden?
Ja.
Den Befehl kenn ich überhaupt nicht, steht auch in meinem c++ Heft nicht drin, glaub ich...
Das ist kein Befehl, sondern ein assoziativer Container, der seine Elemente nicht einfach in fester Reihenfolge hintereinander abspeichert, sondern nach einer (festlegbaren) Ordnungsrelation. Der lässt sich ähnlich wie
vectorbedienen, funktioniert aber grundsätzlich anders.
-
Arcoth schrieb:
Den Befehl kenn ich überhaupt nicht, steht auch in meinem c++ Heft nicht drin, glaub ich...
Das ist kein Befehl, sondern ein assoziativer Container, der seine Elemente nicht einfach in fester Reihenfolge hintereinander abspeichert, sondern nach einer (festlegbaren) Ordnungsrelation. Der lässt sich ähnlich wie
vectorbedienen, funktioniert aber grundsätzlich anders.YMMD

@brak: von welchem Header sprichst du? Du hast keinen Header geschrieben.
-
Seit wann ist set assoziativ? oO
-
Skym0sh0 schrieb:
Seit wann ist set assoziativ? oO
Seit Anbeginn der Zeit.
