for_each mit Lambda-Ausdruck



  • Hallo Zusammen,

    als selbst ernannter Anfänger in c++ versuche ich mich gerade mit Lambda-Ausdrücken.

    In folgendem Code sollen in einer 2d - Deque vom Typ int, Nullen am Ender jeder Reihe entfernt werden. Beispielhaft habe ich zwei Funktionen gegenübergestellt, welche dies erledigen sollen.

    Funktion f1 funktioniert wunderbar.
    Funktion f2 mit Lambda-Ausdruck funktioniert nicht, es gibt keinen Compilerfehler.

    Was mache ich falsch bei f2?

    Vielen Dank für eure Denkanstöße.

    #include <iostream>
    #include <deque>
    #include <algorithm>
    
    using std::deque;
    using std::cout;
    
    typedef deque<int> DI;
    typedef deque<DI> DDI;
    
    void f1(DDI &d) {
    	for(auto it = d.begin(); it < d.end(); ++it) {
    		while(it->back() == 0) {
    			it->pop_back();
    		}
    	}
    }
    
    void f2(DDI &d) {
    	for_each(d.begin(), d.end(), [](DI row) {
    		while(row.back() == 0) {
    			row.pop_back();
    		}
    	});
    }
    
    void print(DDI &d) {
    	for(auto row : d) {
    		for_each(row.begin(), row.end(), [](int i) {cout << i;});
    		cout << "\n";
    	}
    	cout << "\n";
    }
    
    int main() {
    	//Nullen am Ende entfernen
    	DDI ddi = {{0, 1, 0}, {1, 0, 0}, {1, 0, 1}};
    	print(ddi);
    	f1(ddi);
    	print(ddi);
    
    	ddi = {{0, 1, 0}, {1, 1, 0}, {1, 0, 1}};
    	print(ddi);
    	f2(ddi);
    	print(ddi);
    }
    


  • Ich glaube, die for_each macht Probleme, wenn du während der Iterationen über den Container dessen Größe änderst. Kann das sein?

    Was ich mich aber gerade generell frage:
    In deiner f1 function läuft du über ne deque, die wieder deques vom Typ int beinhaltet. Müsstest du da nicht zweimal dereferenzieren, um an die jeweiligen integers zu gelangen? Oder habe ich irgendwo nen Denkfehler?



  • Es wird sinnlos kopiert und auf der Kopie gearbeitet, mach eine Referenz draus:

    for_each(d.begin(), d.end(), [](DI& row) {
    


  • @Faxgerät
    Oh ja - das war es 🙂
    Vielen Dank.

    @Sewing
    pop_back() bezieht sich auf die 1. Ebene (deque<int>) von deque, nicht auf die 2. Ebene (deque<deque<int> >)


Anmelden zum Antworten