Zwei Vektoren zusammenführen -> Laufzeitfehler



  • Hallo,

    ich hab nach langer Pause wieder ein bisschen angefangen zu programmieren und stolpere über für mich nicht lösbares Problem:

    Ich habe zwei Vektoren, die ich zu einem zusammenfügen möchte. Das habe ich nun mit .insert probiert.

    Eine vereinfachte und stark abgespeckte Version findet sich am Ende des Posts. Es sollte alles Wesentliche darin enthalten sein.

    Die ersten 20 Zeilen der main.cpp sind denke ich auch weniger interessant. Der Fehler müsste in Zeile 25 passieren. Der Runtime error spricht jedenfalls von dieser Zeile und sagt dazu "Expression: vector iterators incompatible".

    Ich habe mich dazu an diese Methode halten wollen: http://stackoverflow.com/questions/3177241/what-is-the-best-way-to-concatenate-two-vectors
    Und einen ähnlichen Fall gefunden, der mir aber nicht weiterhilft: http://stackoverflow.com/questions/17459424/error-vector-iterators-incompatible-when-concatenating-two-stl-vectors

    Ich möchte am Ende einen Vektor haben, um diesen mit std::sort sortieren zu können. Ansonsten würde ich eben einen Workaround mit .push_back versuchen, sei aber wohl nicht zu empfehlen.

    Ich hoffe, es ist alles Nötige an Information vorhanden und dass mir jemand weiterhelfen kann.

    Grüße,
    Mr Joe 🙂

    main.cpp:

    void function(vector<Encounter>& myEncounter, vector<Kaempfer>& myPlayer){
    
    	int size = myEncounter.size();
    	int choiceEncounter;
    
    	for (int i=0; i<size; i++)
    	{
    		cout << "\t" << i << ": " << myEncounter[i].getName() << endl;
    	}
    	bool bError;
    	do
    	{
    		bError = false;
    		cin >> choiceEncounter;
    		if(choiceEncounter >= myEncounter.size())
    		{
    			bError = true;
    			cout << "Ung\x81ltige Auswahl getroffen!" << endl;
    		}
    	}while(bError == true);
    
    	vector<Kaempfer> allCombatants;
    	allCombatants.reserve( myEncounter[choiceEncounter].getGroup().size() + myPlayer.size());
    	allCombatants.insert( allCombatants.end(), myEncounter[choiceEncounter].getGroup().begin(), myEncounter[choiceEncounter].getGroup().end());
    	allCombatants.insert( allCombatants.end(), myPlayer.begin(), myPlayer.end());
    
    }
    
    int main{
    
    	vector<Encounter> myEncounter;
    	vector<Kaempfer> myKaempfer;
    
    	function(myEncounter, myKaempfer);
    }
    

    Encounter.cpp:

    Encounter::Encounter(){
    
    	vector<Kaempfer> myGroup;
    	newGroup = myGroup;
    
    	fillVector();
    
    }
    
    	vector<Kaempfer> Encounter::getGroup() const
    {
    	return newGroup;
    }
    


  • Dein getGroup erzeugt eine Kopie!
    Wenn du also getGroup().begin() und getGroup().end() sind das Iteratoren auf unterschiedliche vectoren!

    Also sollte das getGroup vielleicht keine Kopie liefern, sondern ein const&:

    const vector<Kaempfer>& Encounter::getGroup() const
    {
        return newGroup;
    }
    


  • Danke, es hat funktioniert! 👍


Anmelden zum Antworten