Zählen von vorkommen in einem Vektor
Dieses Programm liest zahlen aus einer txt-Datei, wandelt Sie in ganzen zahlen, speichert Sie in einem Vektor, und dann versucht die Ausgabe in einer organisierten Art und Weise wie so....
Wenn txt-Datei sagt:
7 5 5 7 3 117 5
Programm-Ausgänge:
3
5 3
7 2
117
also, wenn die Zahl mehr als einmal vorkommt ausgibt, wie oft das passiert. Hier ist der code, so weit.
#include "std_lib_facilities.h"
int str_to_int(string& s)
{
stringstream ss(s);
int num;
ss >> num;
return num;
}
int main()
{
cout << "Enter file name.\n";
string file;
cin >> file;
ifstream f(file.c_str(), ios::in);
string num;
vector<int> numbers;
while(f>>num)
{
int number = str_to_int(num);
numbers.push_back(number);
}
sort(numbers.begin(), numbers.end());
for(int i = 0; i < numbers.size(); ++i)
{
if(i = 0 && numbers[i]!= numbers[i+1]) cout << numbers[i] << endl;
if(i!=0 && numbers[i]!= numbers[i-1])
{
cout << numbers[i] << '\t' << counter << endl;
counter = 0;
}
else ++counter;
}
}
Edit: Programm stecken. Suchen Sie eine unendliche Schleife jetzt.
Nein, es ist nicht Hausaufgaben. Lesen Profil.
Dein Fehler ist, wenn(i = 0). Sie wollen mit ==. Einzelnes Gleichheitszeichen ist die Zuweisung.
Gah, ich mache immer, wenn ich zu tun != wie gut.
Warum wurde das nicht geschlossen? Er hatte noch nicht einmal eine Frage stellen.
Die änderung der Frage in dieser Art und Weise führen zum erlöschen der ursprünglichen Antworten. Es ist wahrscheinlich am besten, zu akzeptieren, eine Antwort auf die ursprüngliche und starten Sie eine neue Frage für ein neues problem.
Dein Fehler ist, wenn(i = 0). Sie wollen mit ==. Einzelnes Gleichheitszeichen ist die Zuweisung.
Gah, ich mache immer, wenn ich zu tun != wie gut.
Warum wurde das nicht geschlossen? Er hatte noch nicht einmal eine Frage stellen.
Die änderung der Frage in dieser Art und Weise führen zum erlöschen der ursprünglichen Antworten. Es ist wahrscheinlich am besten, zu akzeptieren, eine Antwort auf die ursprüngliche und starten Sie eine neue Frage für ein neues problem.
InformationsquelleAutor trikker | 2009-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie wäre es mit einer Karte, wo der Schlüssel ist die Nummer, die Sie sind tracking und der Wert ist die Anzahl der vorkommen?
Wenn Sie müssen, verwenden Sie einen Vektor, Sie habe bereits sortiert. So verfolgen Sie die Nummer, die Sie zuvor sah. Wenn es das gleiche ist wie die aktuelle Anzahl, Inkrementieren Sie den Zähler. Jedes mal, wenn die Anzahl der änderungen: drucken Sie die aktuelle Nummer und die Anzahl, zurücksetzen der Zähler, legen Sie die last_seen-Nummer auf die neue Nummer.
Ist ein std::vector sortiert an? @
Nein, es ist nicht sortiert. OP-code hat
sort(numbers.begin(), numbers.end());
InformationsquelleAutor bstpierre
Könnten Sie eine Karte von zahlen zu Zählern:
... dann Durchlaufen die Karte, das drucken der Ergebnisse.
BEARBEITEN:
Wie vorgeschlagen, durch lazypython: wenn Sie die TR1-Erweiterungen [wikipedia.org] zur Verfügung, unordered_map sollte besser die Leistung...
btw, dies bedeutet nicht, dass der Vektor sortiert werden ersten.
guter Punkt. Ich dachte nur über die Basis der stl-Version. Ich glaube nicht, dass ein toy-Programm wie dieses beschäftigt sich mit der Geschwindigkeit, aber ich nehme an, es ist am besten zu lernen, die richtigen Techniken in der ersten Zeit.
InformationsquelleAutor Adam Holmberg
Mit Hilfe einer Karte ist die praktische Lösung. Was Sie tun sollten, um dieses problem zu lösen 🙂
Dies wird als Frequenz-Zähler. Also, Sie haben einen sortierten Vektor-und alles, was Sie tun müssen, ist die Anzahl der aufeinanderfolgenden gleichen zahlen. In anderen Worten, Sie haben zu prüfen, jede Zahl mit Ihrem Nachfolger.
InformationsquelleAutor AraK
Was ist der Sinn dieser Speicher Schritt? Wenn Sie beim Lesen der zahlen aus einer Datei, dann werden Sie Sie schon haben, um, bereit, verarbeitet werden (gezählt) werden nacheinander, wie Sie Ihnen begegnen können.
Empfehle ich Ihnen einen Blick auf
std::set
oderstd::map
. Ich erwarte, dass entweder dieser Behälter tun würde, was Sie suchen.InformationsquelleAutor SingleNegationElimination
Std::count()
passt die Rechnung gut.Natürlich gibt es eine Reihe von anderen algorithmen gibt, die denselben job erledigen. Spielen mit Dingen wie
std::equal_range()
in Verbindung mitstd::distance()
wird den job zu erledigen gerade so schön.InformationsquelleAutor D.Shawley
Das war ein Spaß:
InformationsquelleAutor Martin York