Neuer Vektor mit der Summe von Werten aus einem anderen Vektor



  • Guten Morgen!

    Seit gestern versuche ich einen Fehler in meinem Programm zu finden, aber ich komme nicht darauf, was falsch ist. Vielleicht kann mir ja einer von euch helfen.

    Also, mein Programm liest 100 Int-Werte aus einer Datei aus und speichert sie in dem Vektor proctimes. Das scheint zu funktionieren. Dann möchte mit der Funktion Completion die Summe aus den ersten 20 Werten dieses Vektors bilden und die jeweiligen Zwischenergebnisse in einem weiteren Vektor speichern. Ich bin mir aber auch gar nicht sicher, ob ich die Formel überhaupt richtig gemacht habe...

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    #include <sstream>
    
    using namespace std;
    
    void Completion (vector <int> &m1, vector <int> &Cm1)
    {
    	int summeneu; int i = 0; int summe = 0;
    	while (i<20) {
    		i++;
    		summeneu = summe + m1 [i];
    		/*summe = summeneu;*/
    		Cm1[summeneu];
    
    	}
    }
    
    int main ()
    {
    	vector <int> proctimes;
    
    ifstream infile1  ("C:/Datei.txt");
    
    	if (infile1.is_open()) 
    		cout << "Datei wurde geoeffnet" <<endl << endl;
    	else 
    		cout << "Fehler" <<endl<<endl;
    	string line1;
    
    	getline (infile1,line1);
    	getline (infile1,line1);
    	getline (infile1,line1);
    while ( getline (infile1,line1) )
        {
          stringstream s (line1);
    	  int tmp;
    
    	  while (s) {
    
    		s >> tmp;
    		proctimes.push_back(tmp);  
        }
    }
    
    	infile1.clear(); // Fehlerstatus auf 0 setzen
    	infile1.close();
    
    	/*for (int i=0; i < proctimes.size(); ++i)
    	{
    		cout << proctimes [i] << " " << endl;
    	}
    	cout << endl;*/
    	for(vector<int>::iterator it = proctimes.begin(); it != proctimes.end(); ++it) 
            cout << *it << " "; 
    
    	/*vector<int> m1;
    	for (int i=0; i<20;i++)
    	{
    		m1.push_back(proctimes[i]);
    		cout << m1 [i];
    	}*/
    	vector <int> Cm2;
    	Completion(proctimes, Cm2 );
    
    return 0;
    }
    

    Der Fehler, der dann angezeigt wird, ist: Debug Assertion Failed....Expression: vector subscript out of range.

    Über Hilfe bin ich sehr sehr dankbar.



  • Ich bin blöd 🙂 Hab gar nicht push_back verwendet. Jetzt geht es natürlich.
    Aber eine Frage habe ich trotzdem noch: Für das Einlesen habe ich eine Datei mit 5 Zeilen à 20 Werten. Ich habe festgestellt, dass der letzte Wert jeder Zeile doppelt eingelesen wurde. Wie kann ich das vermeiden?



  • beginner58 schrieb:

    Ich habe festgestellt, dass der letzte Wert jeder Zeile doppelt eingelesen wurde. Wie kann ich das vermeiden?

    versuch mal das s>>tmp als bedingung für die innere while-schleife zu benutzen.



  • Deine Berechnung fängt aber beim Index 1 an. (Das i++; steht vor dem m1 [i])

    Bei einer festen Anzahl an Durchläufen ist eine for-Schleife übersichtlicher.



  • Danke für die Lösungen und Hinweise! 🙂



  • Kleiner Tipp, benutze anstelle eines Post-Increment lieber ein Pre-Increment (++i statt i++), bei build-in-Typen optimiert der Compiler automatisch, bei eigenen Klassen ist dies nur schwer möglich.



  • beginner58 schrieb:

    Also, mein Programm liest 100 Int-Werte aus einer Datei aus und speichert sie in dem Vektor proctimes. Das scheint zu funktionieren.

    Um genau zu sein extrahierst Du aus jeder Zeile ab der vierten ints am Zeilenfang. Das mache ich im folgenden nicht, sondern gehe von Zeilen aus, die komplett aus ints bestehen. Wie Du es hier schreibst:

    beginner58 schrieb:

    Für das Einlesen habe ich eine Datei mit 5 Zeilen à 20 Werten.

    beginner58 schrieb:

    Dann möchte mit der Funktion Completion die Summe aus den ersten 20 Werten dieses Vektors bilden und die jeweiligen Zwischenergebnisse in einem weiteren Vektor speichern.

    Das ist partial_sum() aus <numeric> und damit einer der Fälle, in denen Du ordentlich Zeilen und Gehirnschmalz sparen kannst, indem Du Dir einen Überblick über die Standardbibliothek verschaffst - speziell <algorithm> und <numeric> . Dort würde ich immer als erstes schauen, wenn ich irgendwas mit Bereichen aus Containern machen muss.
    Ausserdem gibt es ein Idiom, für das Entfernen von Zeilen aus streams.
    Ob das kopieren mit copy() lesbarer ist sei mal aussen vor - ich will ja die Bibliothek vorstellen.

    #include <iostream>
    #include <vector>
    #include <iterator>  // istream_iterator, ostream_iterator, back_inserter
    #include <limits>    // numeric_limits<>
    #include <numeric>   // partial_sum
    #include <algorithm> // copy
    #include <fstream>
    
    int main(){
      using namespace std;
    
      vector<int> proctimes;
      proctimes.reserve(20);
    
      ifstream infile1("data.txt");
      if(!infile1.is_open()){
        cerr << "Fehler beim oeffnen der Datei.\n";
        return -1;
      }
      // drei Zeilen konsumieren und ignorieren
      for(int i=0; i<3; ++i)
        infile1.ignore(numeric_limits<streamsize>::max(), '\n');
    
      // solange ints lesen, wie es geht
      copy(istream_iterator<int>(infile1), istream_iterator<int>(), back_inserter(proctimes));
    
      if(proctimes.size()<20){
        cerr << "Nicht genuegend Daten.\n";
        return -1;
      }
    
      // Summe bilden mit Zwischenergebnissen
      vector<int> Cm2;
      Cm2.reserve(20);
      partial_sum(proctimes.begin(), proctimes.begin()+20, back_inserter(Cm2));
    
      // Kontrollausgabe:
      copy(Cm2.begin(), Cm2.end(), ostream_iterator<int>(cout, " "));
      cout << endl;
    }
    

Anmelden zum Antworten