tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
1
ZUGRIFFE
265
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    trench140 trench140 ist offline Mitglied Silber
    Registriert seit
    Mar 2008
    Beiträge
    76
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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 :
    1
    
    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
    Geändert von trench140 (03.09.11 um 10:44 Uhr) Grund: Zusatzinfo
     

  2. #2
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.802
    Blog-Einträge
    5
    Hallo,

    Zitat Zitat von trench140 Beitrag anzeigen
    Der Fehler entsteht scheinbar hier:
    Code :
    1
    
    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:

    Code cpp:
    1
    2
    
    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
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

Ähnliche Themen

  1. SQL-Anfrage führt zu unterschiedlichem Ergebnis
    Von saila im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 17.02.08, 21:51
  2. Anhängen eines Bildes als Pflicht
    Von FLASHStyler im Forum PHP
    Antworten: 3
    Letzter Beitrag: 18.09.05, 13:55
  3. gesamten Inhalt eines Vectors ausgeben
    Von AndyVolley im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 11.08.05, 22:23
  4. Selectbox -> Ergebnis an URL anhängen
    Von DeMoehn im Forum PHP
    Antworten: 7
    Letzter Beitrag: 19.06.05, 11:10
  5. Antworten: 1
    Letzter Beitrag: 30.10.04, 16:44