einzelne Elemente in verschachtelter Map löschen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
MoMo
Beiträge: 30
Registriert: Mo Mai 07, 2018 9:49 am

einzelne Elemente in verschachtelter Map löschen

Beitrag von MoMo » Mi Mai 13, 2020 8:26 pm

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ß

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: einzelne Elemente in verschachtelter Map löschen

Beitrag von Xin » Mi Mai 13, 2020 8:59 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MoMo
Beiträge: 30
Registriert: Mo Mai 07, 2018 9:49 am

Re: einzelne Elemente in verschachtelter Map löschen

Beitrag von MoMo » Mi Mai 13, 2020 9:30 pm

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

MoMo
Beiträge: 30
Registriert: Mo Mai 07, 2018 9:49 am

Re: einzelne Elemente in verschachtelter Map löschen

Beitrag von MoMo » Mi Mai 13, 2020 9:38 pm

Also es muss doch irgendeinen Weg geben, ein Element aus einer evrschachtelten Map zu löschen... mmhh nur leider komm ich nicht drauf

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: einzelne Elemente in verschachtelter Map löschen

Beitrag von Xin » Do Mai 14, 2020 1:06 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MoMo
Beiträge: 30
Registriert: Mo Mai 07, 2018 9:49 am

Re: einzelne Elemente in verschachtelter Map löschen

Beitrag von MoMo » Fr Mai 15, 2020 12:05 pm

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;
        }
    }
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: einzelne Elemente in verschachtelter Map löschen

Beitrag von Xin » Fr Mai 15, 2020 12:53 pm

MoMo hat geschrieben:
Fr Mai 15, 2020 12:05 pm
ich habs
Und am Code sieht man, wie nützlich gute Variablennamen sind. :)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten