[C++] Anhängen eines Vectors führt zu fehlerhaftem Ergebnis

trench140

Mitglied
Hallo allerseits,

ich habe eine kleine Methode, welche im grunde genommen nicht mehr tun soll, als mehrere std::vector aneinander zu hängen. Dabei läuft in meinem Fall scheinbar irgendetwas grundlegend schief, denn der entstehende Vektor hat weder eine Länge, die der Summe der beiden Ursprungsvektoren entspricht, noch enthält er eine Anzahl an Elementen die seiner Länge entspricht und schließlich sind die Elemente, die enthalten sind irgendwie zusammengewürfelt.

Konkrete Beispiel:
Ich habe vier Vektoren, jeweils zwei sollen aneinandergefügt werden. Die ersten beiden haben eine Größe von 108 und 27 Elementen, die beiden anderen eine Größe von 28 und 30 Elementen. Im ersten Fall erhalte ich am Ende eine Größe von 271, im zweiten Fall eine Größe von 160 Elementen, was beides definitiv falsch ist. Will ich anschließend vollständig über einen der beiden neuen Vektoren iterieren und den Inhalt ausgeben so stürzt das Programm ab.

Mein Quellcode sieht so aus:
Code:
void Faculty::sortStudentsToCourse() {
	int numCourses = this->getNumCourses();

	std::vector< std::vector<Student*> > courseStudents(4,std::vector<Student*>(0));

	for(int i = 0; i < numCourses; i++) {
		int courseId = this->getCourse(i)->getCourseId();

		if(courseStudents[courseId].empty()) {
			courseStudents[courseId] = this->getCourse(i)->getStudentVector();
		} else {
			courseStudents[courseId].insert(courseStudents[courseId].end(),this->getCourse(i)->getStudentVector().begin(), this->getCourse(i)->getStudentVector().end());
		}
	}
}

Der Fehler entsteht scheinbar hier:
Code:
courseStudents[courseId].insert(courseStudents[courseId].end(),this->getCourse(i)->getStudentVector().begin(), this->getCourse(i)->getStudentVector().end());

Allerdings ist das ja, soweit ich mich recht entsinne, eigentlich die Standardmethode um zwei Vektoren aneinander zu hängen.

Hänge ich die Vektoren übrigens "manuell" aneinander, d.h. iteriere ich über den zweiten vektor und hänge jeden seiner Werte mit "push_back" an den ersten an, funktioniert alles reibungslos. Allerdings denke ich, dass diese Methode sehr ineffizient ist.

Kann der Fehler evt. daher resultieren, dass "getStudentVector" den "const"-Klassifikator hat (std::vector<Student*> Course::getStudentVector() const)? Wie kann ich das Problem umgehen (ohne den const-Klassifikator entfernen zu müssen)?


Viele Grüße,
Trench
 
Zuletzt bearbeitet:
Hallo,

Der Fehler entsteht scheinbar hier:
Code:
courseStudents[courseId].insert(courseStudents[courseId].end(),this->getCourse(i)->getStudentVector().begin(), this->getCourse(i)->getStudentVector().end());
[...]
Kann der Fehler evt. daher resultieren, dass "getStudentVector" den "const"-Klassifikator hat (std::vector<Student*> Course::getStudentVector() const)?
Der const-Qualifikator ist nicht das eigentliche Problem, sondern dass du den Ergebnisvektor by value zurücklieferst. Dadurch erhältst du bei den beiden Aufrufen jeweils eine andere Kopie des Vektors. Somit passen die beiden Iteratoren nicht mehr zusammen, da sie von unterschiedlichen Vektoren stammen. Probier es daher mal so:

C++:
std::vector< std::vector<Student*> > students = this->getCourse(i)->getStudendVector();
courseStudents[courseId].insert(courseStudents[courseId].end(), students.begin(), students.end());

Falls die Rückgabe von getStudentVector eine Membervariable ist (also der Vektor nicht bei jedem Aufruf neu zusammengebaut wird), könntest du auch eine const-Referenz darauf zurückliefern. Damit sparst du dir die Kopie.

Grüße,
Matthias
 
Zuletzt bearbeitet von einem Moderator:
Zurück