Pointerman Geschrieben 30. November 2011 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
flashpixx Geschrieben 30. November 2011 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
schnixx Geschrieben 30. November 2011 Autor Geschrieben 30. November 2011 Gut okay. Ich werds mal versuchen. Danke für tatkräftige Unterstützung...! Zitieren
schnixx Geschrieben 1. Dezember 2011 Autor 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
Klotzkopp Geschrieben 1. Dezember 2011 Geschrieben 1. Dezember 2011 string zieldatei = "Auswertung_" + quelldatei; Zitieren
schnixx Geschrieben 6. Dezember 2011 Autor 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
flashpixx Geschrieben 6. Dezember 2011 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
schnixx Geschrieben 6. Dezember 2011 Autor Geschrieben 6. Dezember 2011 std::map habe ich versucht zu nutzen. Allerdings verstehe ich den map insert befehl nicht ganz. Zitieren
schnixx Geschrieben 6. Dezember 2011 Autor 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
flashpixx Geschrieben 6. Dezember 2011 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
Klotzkopp Geschrieben 6. Dezember 2011 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
schnixx Geschrieben 6. Dezember 2011 Autor Geschrieben 6. Dezember 2011 Nabend, aber StrMap hat gar keine Values wenn ichs debugge... Da passt doch was nicht^^ Zitieren
schnixx Geschrieben 7. Dezember 2011 Autor 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
flashpixx Geschrieben 7. Dezember 2011 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
schnixx Geschrieben 7. Dezember 2011 Autor 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
schnixx Geschrieben 7. Dezember 2011 Autor Geschrieben 7. Dezember 2011 Also in der letzten Zeile... Zitieren
flashpixx Geschrieben 7. Dezember 2011 Geschrieben 7. Dezember 2011 Bitte lerne endlich die Code-Tags zu benutzen ! Zusätzlich möchtest Du den Fehler nennen.... Zitieren
schnixx Geschrieben 7. Dezember 2011 Autor 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
flashpixx Geschrieben 7. Dezember 2011 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
schnixx Geschrieben 7. Dezember 2011 Autor Geschrieben 7. Dezember 2011 das bringt mir auch nichts...wie gesagt...anfänger... Zitieren
flashpixx Geschrieben 7. Dezember 2011 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
schnixx Geschrieben 7. Dezember 2011 Autor 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
Klotzkopp Geschrieben 7. Dezember 2011 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
schnixx Geschrieben 8. Dezember 2011 Autor 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
schnixx Geschrieben 8. Dezember 2011 Autor 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
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.