How to keep only duplicates efficiently?

后端 未结 10 773
闹比i
闹比i 2021-01-04 06:14

Given an STL vector, output only the duplicates in sorted order, e.g.,

INPUT : { 4, 4, 1, 2, 3, 2, 3 }
OUTPUT: { 2, 3, 4 }

The algorithm is

10条回答
  •  半阙折子戏
    2021-01-04 06:46

    Shorter and more STL-ish than previous entries. Assumes sorted input.

    #include 
    #include 
    
    template< class I, class P >
    I remove_unique( I first, I last, P pred = P() ) {
        I dest = first;
        while (
            ( first = std::adjacent_find( first, last, pred ) )
                != last ) {
            * dest = * first;
            ++ first;
            ++ dest;
            if ( ( first = std::adjacent_find( first, last, std::not2( pred ) ) )
                == last ) break;
            ++ first;
        }
        return dest;
    }
    
    template< class I >
    I remove_unique( I first, I last ) {
        return remove_unique( first, last,
            std::equal_to< typename std::iterator_traits::value_type >() );
    }
    

提交回复
热议问题