void sort_and_unique( PartVector & partVector ) { PartVector::iterator begin = partVector.begin(); PartVector::iterator end = partVector.end(); std::sort( begin , end , PartLess() ); PartVector::iterator new_end = std::unique( begin , end ); partVector.erase( new_end , end ); }
bool contain( const PartVector & v , const Part & part ) { const PartVector::const_iterator e = v.end(); PartVector::const_iterator i = v.begin(); i = std::lower_bound( i , e , part , PartLess() ); return i != e && *i == & part ; }
void remove( PartVector & v , Part & part ) { const PartVector::iterator e = v.end(); PartVector::iterator i = v.begin(); i = std::lower_bound( i , e , part , PartLess() ); if ( i != e && *i == & part ) { v.erase( i ); } }
bool insert( PartVector & v , Part & part ) { const PartVector::iterator e = v.end(); PartVector::iterator i = v.begin(); i = std::lower_bound( i , e , part , PartLess() ); const bool new_member = i == e || *i != & part ; if ( new_member ) { v.insert( i , &part ); } return new_member ; }
size_t intersect( const PartVector & v , const PartVector & p , PartVector & r ) { // Both lists must be sorted, assume v.size() > p.size() const PartVector::const_iterator ev = v.end(); PartVector::const_iterator iv = v.begin(); const PartVector::const_iterator ep = p.end(); PartVector::const_iterator ip = p.begin(); for ( ; ip != ep && iv != ev ; ++ip ) { Part * const q = *ip ; iv = std::lower_bound( iv , ev , q , PartLess() ); if ( iv != ev && *iv == q ) { r.push_back( q ); } } return r.size() ; }