30. November 201113 j 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.
30. November 201113 j 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....
1. Dezember 201113 j 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
6. Dezember 201113 j 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"); }
6. Dezember 201113 j 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.
6. Dezember 201113 j std::map habe ich versucht zu nutzen. Allerdings verstehe ich den map insert befehl nicht ganz.
6. Dezember 201113 j 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?
6. Dezember 201113 j 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
6. Dezember 201113 j 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.
6. Dezember 201113 j Nabend, aber StrMap hat gar keine Values wenn ichs debugge... Da passt doch was nicht^^
7. Dezember 201113 j 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.
7. Dezember 201113 j 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.
7. Dezember 201113 j //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?!
7. Dezember 201113 j Bitte lerne endlich die Code-Tags zu benutzen ! Zusätzlich möchtest Du den Fehler nennen....
7. Dezember 201113 j 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...
7. Dezember 201113 j 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
7. Dezember 201113 j 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
7. Dezember 201113 j 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.
7. Dezember 201113 j 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?
8. Dezember 201113 j 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.
8. Dezember 201113 j Bin ich auf dem richtigen Weg?Ist das überhaupt möglich. Inhalt einer map in eine andere map einzufügen?
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.