#include <set>
#include <string>
#include <iostream>

struct human
{
    human( const std::string& name ) : name(name) {}
    // ..
    const std::string name ;
    // ...
    bool operator< ( const human& that ) const { return name < that.name ; }
};

int main()
{
    std::set<human> humans { {"a"}, {"b"}, {"c"}, {"d"}, {"e"}, {"f"}, {"g"}, {"h"}, {"i"} } ;
    std::set< const human* > selected_hunans ;

    // select some humans
    for( const human& h : humans )
    {
        static bool select = false ;
        if( ( select = !select ) ) selected_hunans.insert( std::addressof(h) ) ;
    }

    std::cout << "\nhumans: " ; for( const human& h : humans ) std::cout << h.name ;
    std::cout << "\nselected: " ; for( const human* p : selected_hunans ) std::cout << p->name ;

    // remove all the currently selected humans from the set of humans
    for( const human* p : selected_hunans ) humans.erase(*p) ;
    selected_hunans.clear() ; // these pointers are no longer invalid

    std::cout << "\nremaining humans: " ; for( const human& h : humans ) std::cout << h.name ;
    std::cout << '\n' ;
}
