c++ - set_difference and set_intersection simultaneously -


i'm wondering if there facility in standard library simultaneously compute set intersection , set difference between 2 sorted ranges. signature along lines of:

template <class input1, class input2,            class output1, class output2, class output3> output3 decompose_sets (input1 first1, input1 last1,                         input2 first2, input2 last2,                         output1 result1, output2 result2,                         output3 result3 ); 

such after call decompose sets, result1 contains elements in [first1,last1) not in [first2,last2), result2 contains elements in [first2,last2) not in [first1,last1), , result3 contains element common in [first1,last1) , [first2,last2).

the example implementations of set_difference , set_intersection cplusplus.com seem can me create efficient implementation performs 1 scan instead of three. if it's in standard library, though, i'd hate reinvent wheel.

example, request:

given 2 sets a={0, 1, 2, 3, 4} , b={2, 4, 5, 6} build following 3 sets:

  • only_a = {0,1,3}
  • only_b = {5,6}
  • common = {2,4}

there's no standard library algorithm in single scan it's easy write. following looks correct , output makes sense here on ideone.com.

template <class input1, class input2,             class output1, class output2, class output3> output3 decompose_sets(input1 first1, input1 last1,                     input2 first2, input2 last2,                     output1 result1, output2 result2,                     output3 result3) {     while (first1 != last1 && first2 != last2) {         if (*first1 < *first2) {             *result1++ = *first1++;         } else if (*first2 < *first1) {             *result2++ = *first2++;         } else {             *result3++ = *first1++;             ++first2; // skip common value in set2         }     }     std::copy(first1, last1, result1);     std::copy(first2, last2, result2);     return result3; } 

Comments

Popular posts from this blog

css - Which browser returns the correct result for getBoundingClientRect of an SVG element? -

gcc - Calling fftR4() in c from assembly -

.htaccess - Matching full URL in RewriteCond -