Seite 1 von 1

einzelne Elemente in verschachtelter Map löschen

Verfasst: Mi Mai 13, 2020 8:26 pm
von MoMo
Hallo Leute,

ich möchte aus meiner verschachtelten Map alle Punkte löschen, die die Koordinaten 0,0 haben. ich hab mir folgenden Code ausgedacht, doch irgendwie löscht der nicht die einzelnen Punkte sondern Komplette Reihen.

Code: Alles auswählen

    for(std::map<int,std::map<int,cv::Point>>::const_iterator i = m_Points.begin(); i!= m_Points.end();i++) {

        for(std::map<int,cv::Point>::const_iterator j =  i->second.begin(); j != i->second.end(); j++){

            if(j->second.x == 0 && j->second.y == 0){

                m_Points.erase(j->first);
            }
        }
    }
Eine weiter Idee war

Code: Alles auswählen

m_Points[i->first].erase(j->first);
aber geht auch nicht.

Hat jemand eine Tipp ?

Gruß

Re: einzelne Elemente in verschachtelter Map löschen

Verfasst: Mi Mai 13, 2020 8:59 pm
von Xin
Ich bin nicht sicher, wozu die Map überhaupt gut ist, aber das sei mal dahin gestellt.

j->First ist ein int. Erase erwartet einen Iterator oder Key. j ist ist ein std::map<int,cv::Point>::const_iterator, während m_Points offenbar vom Typ std::map<int,std::map<int,cv::Point>> ist - der Iterator passt also nicht zur map.
Du möchtest vielleicht i->erase(j) bzw. i->erase(j->first) sagen?

Re: einzelne Elemente in verschachtelter Map löschen

Verfasst: Mi Mai 13, 2020 9:30 pm
von MoMo
Es handelt sich um ein Gitter mit Punkten.
[-2,1][-1,1][0,1][1,1]
[-2,0][-1,0][0,0][1,0]
[-2,-1][-1,-1][0,-1][1,-1]

Die Reihen können unterschiedliche indizes haben. Lücken aufweisen und unterschieldich lang sein.
in der äßueren Map ist das "int" die x Koordinate und in der inneren Map das int die y Koordinate. der Point selbst hat dann die Bildpunkt-Koordinaten zu dem jeweiligen Gitterpunkt.

Lieder geht beides nicht ( bei i->erase(j->first) ) kommt zb:
R:\Analysis\analyzer.cpp:581: error: C2039: 'erase': is not a member of 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>'
with
[
_Kty=int,
_Ty=std::map<int,cv::Point,std::less<int>,std::allocator<std::pair<const int,cv::Point>>>
]

Auf das Element zugreifen geht ja über die iteratoren, aber das löschen nur leider nicht

Re: einzelne Elemente in verschachtelter Map löschen

Verfasst: Mi Mai 13, 2020 9:38 pm
von MoMo
Also es muss doch irgendeinen Weg geben, ein Element aus einer evrschachtelten Map zu löschen... mmhh nur leider komm ich nicht drauf

Re: einzelne Elemente in verschachtelter Map löschen

Verfasst: Do Mai 14, 2020 1:06 am
von Xin
MoMo hat geschrieben:
Mi Mai 13, 2020 9:30 pm
Lieder geht beides nicht ( bei i->erase(j->first) ) kommt zb:
R:\Analysis\analyzer.cpp:581: error: C2039: 'erase': is not a member of 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const _Kty,_Ty>>>>'
with
[
_Kty=int,
_Ty=std::map<int,cv::Point,std::less<int>,std::allocator<std::pair<const int,cv::Point>>>
]

Auf das Element zugreifen geht ja über die iteratoren, aber das löschen nur leider nicht
Naja, ich schrieb das jetzt ohne irgendwelche Informationen aus dem Kopf heraus und was ich schrieb war offensichtlich falsch. :-)
Aber das Problem beschreibt die Fehlermeldung doch: i ist ein Iterator, der auf ein Key-Vatue-Pair zeigt und nicht auf die Map aus der Du löschen möchtest.
Die Map ist second in dem Pair. Du musst also aus dem Iterator auf das Pair zugreifen, was mit -> geht und dann die Map nehmen: i->second. Dort löschst Du dann.
Entsprechend müsste i->second.erase(j) bzw. i->second.erase(j->first) das gewünschte Ergebnis bringen.

Re: einzelne Elemente in verschachtelter Map löschen

Verfasst: Fr Mai 15, 2020 12:05 pm
von MoMo
ich habs

Code: Alles auswählen

for (auto &outerPair : m_Points) {
    auto &innerMap = outerPair.second;
    for (auto it = innerMap.cbegin(); it != innerMap.cend(); /* nix */) {
        if (it->second.x == 0 && it->second.y == 0) {
            innerMap.erase(it++);
        } else {
            ++it;
        }
    }
}

Re: einzelne Elemente in verschachtelter Map löschen

Verfasst: Fr Mai 15, 2020 12:53 pm
von Xin
MoMo hat geschrieben:
Fr Mai 15, 2020 12:05 pm
ich habs
Und am Code sieht man, wie nützlich gute Variablennamen sind. :)