Pointerman Geschrieben 30. November 2011 Teilen Geschrieben 30. November 2011 Schau Dir mal diese einfachen Beispiele an: Einleitung in die C++ Standard-Library std::map example std:map ist kein Hexenwerk und eine einfache Suche haette Dir diese Beispiele geliefert. Nach der Lektuere der o.g. Links solltest Du Klotzkopps rat befolgen und die Map fuellen, statt die Zeilen auszugeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 30. November 2011 Teilen Geschrieben 30. November 2011 Gibt es eventuell noch andere Möglichkeiten in Kombination mit der Syntax?! Es gibt durchaus andere Möglichkeiten, aber wie schon gesagt std::map ist genau das was Du dafür benötigst, als Anfänger solltest Du Dich evtl darin einmal einarbeiten. Wir haben Dir mit dieser Information schon die passende Datenstruktur für Dich ausgesucht.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 30. November 2011 Autor Teilen Geschrieben 30. November 2011 Gut okay. Ich werds mal versuchen. Danke für tatkräftige Unterstützung...! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 1. Dezember 2011 Autor Teilen Geschrieben 1. Dezember 2011 Hallo zusammen, bisher hat alles sehr gut funktioniert.Danke für eure Anregungen. Nun noch eine Frage: Wie kann ich die Ausgegebene Datei so bennen, dass der Name der Quelldatei mit eingeschlossen wird. Den Quelldateinamen schreibe ich in einen string. Bsp.: Quelldatei: test.txt Ausgabedatei: Auswertung_test.txt Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Dezember 2011 Teilen Geschrieben 1. Dezember 2011 string zieldatei = "Auswertung_" + quelldatei; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 6. Dezember 2011 Autor Teilen Geschrieben 6. Dezember 2011 Hallo zusammen, ich bin soweit durch mit meinem Tool. Allerdings habe ich das Problem, das der Durchlauf des Tools bis zum Abschluss ca. 8 Minuten dauert. Das ist eindeutig zu lange für den simplen Zeilenvergleich, auch wenn es pro Datei ca 4000 Zeilen sind. Gibt es mögliche Verbesserungsvorschläge oder Ideen, um die Laufzeit zu verbessern?! Auszug aus meinem Quelltext, ab der Stelle, wo das Programm meines erachtens zu lange benötigt: //------------------------------------ //Vergleich auf Gleichheit der beiden Dateien von Datei 1 zu Datei 2 //Einlesen der das restlichen einmalig vorkommenden Zeilen aus vorheriger Datei std::ifstream final_out3("complete_out3.txt", ios::in); //Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline3 while((!final_out3.eof()) && (getline (final_out3, newline3))) { std::ifstream final_out4("complete_out4.txt", ios::in); //Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline4 while ((!final_out4.eof()) && (getline(final_out4, newline4))) { //Vergleich der beiden eingelesenen Zeilen if(newline3.compare(newline4) !=0) //if(newline3!=newline4) { //Zähler incrementieren, um zu testen ob Zeile in beiden Dateien vorhanden ist ungleich++; //std::cout << " " << line << "\n" ; //std::cout << " " << line2 << "\n" ; } else { //Wenn Exitenz nur in einer Datei, incrementiere Zähler "gleich" gleich++; } } //Abfrage, um Exitenz in beiden Dateien zu prüfen, Ausgabe wenn Pfad in zweiter Datei fehlt if (gleich==0) { //std::cout << File2<<newline3<<" unequal...\n"<< std::endl; //Ausgabe in Datei final << File2<<newline3<<" unequal...\n"<< std::endl; } //Zähler gleich 0 setzen ungleich=0; gleich=0; } //-------------------------------- //Vergleich auf Gleichheit der beiden Dateien von Datei 2 zu Datei 1 //Einlesen der das restlichen einmalig vorkommenden Zeilen aus vorheriger Datei std::ifstream final_out4("complete_out4.txt", ios::in); //Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline4 while((!final_out4.eof()) && (getline (final_out4, newline4))) { //Einlesen der das restlichen einmalig vorkommenden Zeilen aus vorheriger Datei std::ifstream final_out3("complete_out3.txt", ios::in); //Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline4 while ((!final_out3.eof()) && (getline(final_out3, newline3))) { //Vergleich der beiden eingelesenen Zeilen if(newline3.compare(newline4) !=0) //if(newline3!=newline4) { //Zähler hochzählen, um zu testen ob Zeile in beiden Dateien vorhanden ist ungleich++; //std::cout << " " << line << "\n" ; //std::cout << " " << line2 << "\n" ; } else { //Wenn Exitenz nur in einer Datei, incrementiere Zähler "gleich" gleich++; } } //Abfrage, um Exitenz in beiden Dateien zu prüfen, Ausgabe wenn Pfad in erster Datei fehlt if (gleich==0) { std::cout << File1<< newline4<<" unequal...\n"<< std::endl; //Ausgabe in Datei final << File1<< newline4<<" unequal...\n"<< std::endl; } //Zähler gleich 0 setzen ungleich=0; gleich=0; } //std::remove("complete_out3.txt"); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 6. Dezember 2011 Teilen Geschrieben 6. Dezember 2011 Verwende die Code-Tags, denn so ist das ganze nicht wirklich lesbar. Du verwendest keine std::map, so wie Dir hier geraten wurde, Du hast hier einen O(n^2) Algorithmus erzeugt und damit ist die schlechte Performance erklärbar. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 6. Dezember 2011 Autor Teilen Geschrieben 6. Dezember 2011 std::map habe ich versucht zu nutzen. Allerdings verstehe ich den map insert befehl nicht ganz. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 6. Dezember 2011 Autor Teilen Geschrieben 6. Dezember 2011 void increment (int &i) { i++; } while(std::getline(in, line)) { //Prüfung ob Zeilen den Anforderungen entspricht if(line.length() > 0 && line[0] == '[') { increment(StrMap[line]); StrMap.insert(pair<map<string,int>()); } } Was würde ich den in die Klammern des StrMap.insert einsetzen, damit die Map gefüllt wird? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 6. Dezember 2011 Teilen Geschrieben 6. Dezember 2011 Was würde ich den in die Klammern des StrMap.insert einsetzen, damit die Map gefüllt wird? Du möchtest lernen, wie eine Dokumentation zu lesen ist map::insert - C++ Reference und wie Code-Tags zu verwenden sind Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 6. Dezember 2011 Teilen Geschrieben 6. Dezember 2011 Was würde ich den in die Klammern des StrMap.insert einsetzen, damit die Map gefüllt wird?Du brauchst insert hier gar nicht. StrMap[line] sorgt schon dafür, dass ein Eintrag für diesen Schlüssel angelegt und der Wert mit 0 initialisiert wird, falls es noch keinen gibt. Deine increment-Funktion finde ich übrigens ziemlich merkwürdig, die macht den Code nur länger. ++StrMap[line];tut's auch. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 6. Dezember 2011 Autor Teilen Geschrieben 6. Dezember 2011 Nabend, aber StrMap hat gar keine Values wenn ichs debugge... Da passt doch was nicht^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 7. Dezember 2011 Autor Teilen Geschrieben 7. Dezember 2011 Mit welchem Algorithmus könnte ich die Performance steigern?! Ich benötige einen der zwei Dateien einlesen kann und aus den jeweiligen Dateien die Zeilen vergleicht! Das ganze über verschachtelte Schleifen zu regeln, scheint ja eher suboptimal. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 7. Dezember 2011 Teilen Geschrieben 7. Dezember 2011 Mit welchem Algorithmus könnte ich die Performance steigern?! Lies Dich doch bitte einmal in std::map ein, std::map bietet alles was Du brauchst !! Du kannst Daten einfügen, suchen, löschen und auch alle Daten nach dem Schlüssel sortiert ausgeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 7. Dezember 2011 Autor Teilen Geschrieben 7. Dezember 2011 //Aufruf der Klasse map und Angabe des Namens std::map<string,int> StrMap; //Schleife zum Durchlauf der ersten Datei und einlesen jeder Zeile while(std::getline(in, line)) { //Prüfung ob Zeilen den Anforderungen entspricht if(line.length() > 0 && line[0] == '[') { ++StrMap[line]; //increment(StrMap[line]); //Falls Prüfung zutrifft wird die Zeile //im ersten Durchlauf in der map angelegt, bei allen weiteren wird der Zähler erhöht } } for (map<string,int>::iterator it =StrMap.begin(); it!=StrMap.end();it++) if ((*it).second > 1) cout << (*it).first << " " << (*it).second << endl; map<string, int>anotherStrMap; anotherStrMap.insert(StrMap.begin(),StrMap.find((*it).second)); Warum gibt es hier einen Fehler?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 7. Dezember 2011 Autor Teilen Geschrieben 7. Dezember 2011 Also in der letzten Zeile... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 7. Dezember 2011 Teilen Geschrieben 7. Dezember 2011 Bitte lerne endlich die Code-Tags zu benutzen ! Zusätzlich möchtest Du den Fehler nennen.... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 7. Dezember 2011 Autor Teilen Geschrieben 7. Dezember 2011 Fehlermeldung: error C2664: 'std::_Tree<_Traits>::iterator std::_Tree<_Traits>::find(const std::_Tree<_Traits>::key_type &)' : cannot convert parameter 1 from 'int' to 'const std::_Tree<_Traits>::key_type &' Sorry bin Laie im Programmieren und weiß net was du damit meinst... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 7. Dezember 2011 Teilen Geschrieben 7. Dezember 2011 Schau Dir an, was die Methode "begin()" für einen Datentyp liefert (Stichwort Iterator) und was die insert-Methode der Map als ersten Parameter für einen Typ erwartet Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 7. Dezember 2011 Autor Teilen Geschrieben 7. Dezember 2011 das bringt mir auch nichts...wie gesagt...anfänger... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 7. Dezember 2011 Teilen Geschrieben 7. Dezember 2011 das bringt mir auch nichts...wie gesagt...anfänger... Ich wiederhole mich: Lies Dir zu genannten Sachen die Dokumentation durch. Mir entsteht hier der Eindruck, dass Du von uns gesagt bekommen möchtest, wie Dein Problem zu lösen ist, ohne selbst zu verstehen, wie es funktioniert Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 7. Dezember 2011 Autor Teilen Geschrieben 7. Dezember 2011 Da täuscht der Eindruck allerdings... Das Programm läuft ja auch bereits, allerdings etwas langsam^^. Ich habe doch bereits gesagt, dass ich mich mit std::map nicht auskenne und auch nicht verstehe wie es funktioniert, obwohl ich die Dokumentationen hoch und runter gelesen habe. Ich habe heute den ganzen Tag versucht das Problem zu lösen, allerdings hat dies nicht geklappt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 7. Dezember 2011 Teilen Geschrieben 7. Dezember 2011 Warum gibt es hier einen Fehler?!Weil du in einer string-Map nach einem int suchst. std::map::find sucht nach Schlüsseln, nicht nach Werten. Was soll dieser Code überhaupt bezwecken, wofür brauchst du die zweite Map? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 8. Dezember 2011 Autor Teilen Geschrieben 8. Dezember 2011 Um das ganze nicht laufend in Dateien schreiben zu müssen, weil ich vermute das die Dateiverarbeitung dafür verantwortlich ist, dass mein Programmablauf ca. acht Minuten brauch. Ich dachte mir ich mache das statt Dateien in maps. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
schnixx Geschrieben 8. Dezember 2011 Autor Teilen Geschrieben 8. Dezember 2011 Bin ich auf dem richtigen Weg?Ist das überhaupt möglich. Inhalt einer map in eine andere map einzufügen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.