Ich habe eine Liste von weak_ptrs, die ich verwende, um Objekte zu verfolgen. Zu einem bestimmten Zeitpunkt möchte ich einen Eintrag aus der Liste entfernen, wenn shared_ptr oder weak_ptr angegeben wurde.Entfernen von Element aus der Liste der weak_ptrs
#include <list>
int main()
{
typedef std::list< std::weak_ptr<int> > intList;
std::shared_ptr<int> sp(new int(5));
std::weak_ptr<int> wp(sp);
intList myList;
myList.push_back(sp);
//myList.remove(sp);
//myList.remove(wp);
}
Allerdings, wenn ich die obigen Zeilen Kommentar-, wird das Programm nicht bauen:
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\list(1194): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::tr1::weak_ptr<_Ty>' (or there is no acceptable conversion)
Wie entferne ich ein Element aus der eine shared_ptr gegebenen Liste oder eine weak_ptr?
Es gibt ein 'owner_before', obwohl, die ein teilweise order.So implementiert schreiben Sie könnten auch das Lambda als' [wp] (std :: weak_ptr p) {return! (P.owner_before (wp) || wp.owner_before (p)); '- keine Sperre erforderlich. Auch in Ihrem Code haben Sie den "swp == sp == 0" Fall übersehen. –
MSalters
Gibt es eine Möglichkeit, dies ohne ein Lambda zu tun? Ich werde Gegenstände an vielen verschiedenen Orten entfernen. Ich sehe, dass das Prädikat remove_if für jedes Element einzeln aufgerufen wird, aber ich muss 2 Zeiger vergleichen, wie Sie oben haben. – user987280
@ user987280 Sicher können Sie einen Funktor oder eine freie Funktion anstelle eines Lambda verwenden. Aber was genau ist das Problem, dass das Prädikat für jedes Element aufgerufen wird? – mkaes