How to remove unique_ptr by pointer from a container?
You will need to find the iterator corresponding to the myClass
element and then pass that iterator to mySet.erase()
. The iterator may be found using the std::find_if
algorithm with a custom Predicate
functor that understands how to dereference unique_ptr
and compare it to the raw pointer myClass
.
You can not use the overloaded size_t set::erase ( const key_type& x );
since the raw pointer (even if wrapped in a temporary unique_ptr
) will not be found in mySet
.
Not as pretty as I would've liked. But the following does the job:
#include <memory>
#include <set>
#include <iostream>
struct do_nothing
{
void operator()(const void*) const {}
};
struct MyClass
{
MyClass() {std::cout << "MyClass()\n";}
MyClass(const MyClass&) {std::cout << "MyClass(const MyClass&)\n";}
~MyClass() {std::cout << "~MyClass()\n";}
};
int main()
{
std::set<std::unique_ptr<MyClass>> mySet;
MyClass *myClass = new MyClass();
mySet.insert(std::unique_ptr<MyClass>(myClass));
// remove myClass from mySet?
std::set<std::unique_ptr<MyClass>>::iterator i =
lower_bound(mySet.begin(), mySet.end(),
std::unique_ptr<MyClass, do_nothing>(myClass));
if (i != mySet.end() && *i == std::unique_ptr<MyClass, do_nothing>(myClass))
mySet.erase(i);
}