Multimap: Assoziative Container nach Werten durchsuchen



  • Hallo Leute,

    ich habe gerade ein kleines Problem.
    Ich habe zwei Multimap Container, beide enthalten Paare von einem Integer und einem Namen. Sortiert werden beide jeweils nach ihren Integern (das brauche ich auch). Ich will jetzt, nachdem ich die ersten 5 Elemente des einen ausgelesen habe, alle Elemente mit dem gleichen Namen (der Name ist nicht der Key!) aus dem zweiten herauslöschen.

    Das habe ich bisher - es funktioniert (natürlich) nicht:

    AnsiString ShowSorted(multimap<int, AnsiString>& m, multimap<int, AnsiString>& del){ //returned den jeweils nächsten
    typedef multimap<int, AnsiString> MType;
    AnsiString result;
    
    MType::reverse_iterator i = m.rbegin();
    		MType::iterator first = m.lower_bound(i->first);
    		MType::iterator j, last = m.upper_bound(i->first);
    			for( j = first; j!=last; j++){//j->second ist ein Datenwert zum SchlüsselWert
    				if(j != first)//wenn es zwei gleistarke gibt, sollen sie beide mit und verbunden, dargestellt werden
    					result += " und ";
    				result += j->second;
    
    				for(MType::reverse_iterator k = del.rbegin(); k != del.rend();){ //durchsucht jedes mal den gesamten anderen Container auf Gleichheit der second-Werte
    					MType::iterator first_del  = del.lower_bound(k->first);  // und soll diese daraus löschen!
    					MType::iterator l, last_del = del.upper_bound(k->first);
    					for(l = first_del; l != last_del; l++){
    						if(l->second == j->second)
    							del.erase(l);
    					k++;
    					};
    				}
    			}
    	m.erase(first, j);   //ja, soll alle Elemente mit gleichem key aus dem ersten Container herauslöschen
    	return result;
    };
    

    Vielleicht sind multimaps gar nicht geeignet dafür ? Ich hab keine große Lust eine Container-KLasse zu entwerfen ;)...
    Ist die Fragestellung klar ? ich spezifiziere gerne ..:)
    Bis dann und danke!



  • vielleicht bringt dich std::remove_if() weiter?
    "alle elemente mit dem gleichen namen" zu löschen - gleich in welcher Hinsicht?
    mehrfach vorkommende Namen? Oder Namen die gleich denen in der ersten mutlimap sind?

    evenduell kann dir auch eine bidirectional map weiterhelfen:
    http://www.codeproject.com/KB/stl/bimap.aspx



  • Ach so, ich kann ja nochmal sagen, dass ich mir des Problemes durchaus bewusst bin - aber gerade nicht ganz genau weiß, wie ich es ausdrücken kann. Also im Prinzip arbeitet das Multimap als Container für container, richtig ? die zweite ebene sind dann container, die alle Paare enthalten, die gleichheit beim key aufweisen. Ich will nun auf dieser zweiten ebene aber genau das Element löschen - das geht mit del.erase(l) natürlich nicht - da erase auf der ebende darüber arbeitet. Wie mache ich das also ???



  • pumuckl schrieb:

    vielleicht bringt dich std::remove_if() weiter?
    "alle elemente mit dem gleichen namen" zu löschen - gleich in welcher Hinsicht?
    mehrfach vorkommende Namen? Oder Namen die gleich denen in der ersten mutlimap sind?

    gleich denen in der ersten Multimap !


Anmelden zum Antworten