Search code examples
c++bashsetshared-ptrerase

how to remove a shared ptr element from set?


I have a set where each element in the set is of type shared_ptr, I want to remove an element from the set, in eclipse the element was actually removed but when I test this in bash with valgrind I get a lot of invalid size mistakes ...

So this made me think that maybe there is a different way to remove element of type shared_ptr ?

Every element in the peoplePointer is a class of certain person:

typedef std::shared_ptr<person> peoplePointer;

class AA {
    std::set<peoplePointer> setOfPeople;

public:
    // function getName() return name of the person (person is another class) 
    void removeSomeonefromA(const std::string& name) {
        for (std::set<peoplePointer>::iterator it = setOfPeople.begin();it != setOfPeople.end(); it++) {
            if(name == (*it).get()->getName()) {
                setOfPeople.erase((it));
            }
        }
    }
};

Solution

  • Idea inspired by remove_if equivalent for std::map.

    If you are able to use a C++11 or later compiler, you can use:

    void removeSomeonefromA(const string& name)
    {
       for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end();  /* Empty */ )
       {
          if(name == (*it).get()->getName())
          {
             it = setOfPeople.erase(it);
          }
          else
          {
             ++it;
          }
       }
    }
    

    If you are required to use a prior compiler version, you can use:

    void removeSomeonefromA(const string& name)
    {
       for (set<peoplePointer>::iterator it = setOfPeople.begin(); it != setOfPeople.end();  /* Empty */ )
       {
          if(name == (*it).get()->getName())
          {
             setOfPeople.erase(it++);
          }
          else
          {
             ++it;
          }
       }
    }