Vector - out of range



  • Hallo , ich brauche ein bisschen Hilfe.
    Aufgabe ist :
    Schreiben Sie eine Funktion, die einen Vektor vom Typ vector<vector<int>> als Parameter erhält und die Zahlen so umordnet, dass alle einstelligen Zahlen im ersten Element des Vektors enthalten sind, alle zweistelligen im zweiten usw. Die Funktion soll als return Wert einen Vektor von double Werten liefern, der die Mittelwerte der Gruppen beinhaltet.

    Testreihe 1: 5 12 2430 1 17
    Testreihe 2: 5219 22 9 12
    Testreihe 3: 7 9 18 4231
     
    umgeordneter Vektor : {{5, 1, 9, 7, 9}, {12, 17, 22, 12, 18}, {2430, 5219, 4231}}
    Returnwert: {6.2, 16.2, 3960}
    

    bin soweit :

    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace std;
    
    vector<vector<double>>function(vector<vector<int>>tests) {
    
    	vector<vector<double>>mittelwert;
    	vector<vector<int>>geordneter_Vector;
    
    	for (size_t i{ 0 };i < tests[0].size(); ++i) {
    		string ziff = to_string(tests[0].at(i));
    		if(ziff.length() == 1){
    			geordneter_Vector[0].push_back(i);
    		}
    		else if (ziff.length() == 2) {
    			geordneter_Vector[1].push_back(i);
    		}
    		else if (ziff.length() == 3) {
    			geordneter_Vector[2].push_back(i);
    		}
    	}
    
    	for (size_t i{ 0 }; i < tests[0].size(); ++i) {
    		string ziff = to_string(tests[1].at(i));
    		if (ziff.length() == 1) {
    			geordneter_Vector[0].push_back(i);
    		}
    		else if (ziff.length() == 2) {
    			geordneter_Vector[1].push_back(i);
    		}
    		else if (ziff.length() == 3) {
    			geordneter_Vector[2].push_back(i);
    		}
    	}
    
    	for (size_t i{ 0 }; i < tests[0].size(); ++i) {
    		string ziff = to_string(tests[2].at(i));
    		if (ziff.length() == 1) {
    			geordneter_Vector[0].push_back(i);
    		}
    		else if (ziff.length() == 2) {
    			geordneter_Vector[1].push_back(i);
    		}
    		else if (ziff.length() == 3) {
    			geordneter_Vector[2].push_back(i);
    		}
    	}
    
    	for (const auto& v : geordneter_Vector[0])
    		cout << v << ' ';
    	cout << '\n';
    
    	for (const auto& v : geordneter_Vector[1])
    		cout << v << ' ';
    	cout << '\n';
    
    	for (const auto& v : geordneter_Vector[2])
    		cout << v << ' ';
    	cout << '\n';
    
    	for (int i{ 0 }; i <= geordneter_Vector[0].size(); i++) {
    		geordneter_Vector[0].at(0) += geordneter_Vector[0].at(i);
    	}
    	double mittelwertNull = geordneter_Vector[0].at(0) / geordneter_Vector[0].size();
    	mittelwert[0].push_back(mittelwertNull);
    
    	for (int i{ 0 }; i <= geordneter_Vector[1].size(); i++) {
    		geordneter_Vector[1].at(0) += geordneter_Vector[1].at(i);
    	}
    	double mittelwertOne = geordneter_Vector[1].at(0) / geordneter_Vector[1].size();
    	mittelwert[1].push_back(mittelwertOne);
    
    	for (int i{ 0 }; i <= geordneter_Vector[2].size(); i++) {
    		geordneter_Vector[2].at(0) += geordneter_Vector[2].at(i);
    	}
    	double mittelwertTwo = geordneter_Vector[2].at(0) / geordneter_Vector[2].size();
    	mittelwert[2].push_back(mittelwertTwo);
    
    
    	for (const auto& v : mittelwert[0])
    		cout << v << ' ';
    	cout << '\n';
    
    	for (const auto& v : mittelwert[1])
    		cout << v << ' ';
    	cout << '\n';
    
    	for (const auto& v : mittelwert[2])
    		cout << v << ' ';
    	cout << '\n';
    
    	return mittelwert;
    }
    
    
    int main() {
    
    	vector<vector<int>> test{{5, 12, 2430, 1, 17},{5219, 22, 9, 12},{7, 9, 18, 4231}};
    
    	function(test);
    
    	return 0;
    }
    

    Leider bekomme ich immer die Warnung : "vector subscript out of range".



  • @Xerodus sagte in Vector - out of range:

    i < tests[0].size();

    Warum sehen die Bedingungen in den Schleifen alle so aus? Wenn dann z.B. string ziff = to_string(tests[2].at(i)); einen Fehler liefert, ist das kein Wunder.

    Benutze einen Debugger. Der sagt dir genau, an welcher Stelle der Fehler auftritt.

    Was macht dein Programm bei vier Testreihen? 5? 6?



  • @manni66 weiss leider nicht , was ich statt

    for (size_t i{ 0 };i < tests[0].size(); ++i) {
    

    benutzten könnte.



  • Ich finde schon die Aufgabe unklar:

    @Xerodus sagte in Vector - out of range:

    die Zahlen so umordnet, dass alle einstelligen Zahlen im ersten Element des Vektors enthalten sind, alle zweistelligen im zweiten usw.

    Dann würde ich doch denken, die dreistelligen im dritten und vierstelligen im vierten Element. Aber in deinem Beispiel sind die vierstelligen Zahlen im dritten Element, weil es keine 3stelligen Zahlen in der Eingabe gibt. Sollte dann nicht das dritte Element ein leerer vector sein?

    Und auch zum Ruckgabetyp deiner Funktion solltest du dir Gedanken machen. Ist da ein vector von vector wirklich richtig?



  • @Xerodus sagte in Vector - out of range:

    @manni66 weiss leider nicht , was ich statt

    for (size_t i{ 0 };i < tests[0].size(); ++i) {
    

    benutzten könnte.

    Erkläre, was das macht.


Log in to reply