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.
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....
schnixx Geschrieben 30. November 2011 Autor Geschrieben 30. November 2011 Gut okay. Ich werds mal versuchen. Danke für tatkräftige Unterstützung...!
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
Klotzkopp Geschrieben 1. Dezember 2011 Geschrieben 1. Dezember 2011 string zieldatei = "Auswertung_" + quelldatei;
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"); }
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.
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.
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?
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
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.
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^^
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.
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.
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?!
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....
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...
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
schnixx Geschrieben 7. Dezember 2011 Autor Geschrieben 7. Dezember 2011 das bringt mir auch nichts...wie gesagt...anfänger...
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
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.
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?
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.
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?
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden