同时set_difference和set_intersection

che*_*kow 7 c++ stl std

我想知道标准库中是否有任何工具可以同时计算集合交集并设置两个排序范围之间的差异.带有签名的东西:

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 );
Run Code Online (Sandbox Code Playgroud)

使得后调用decompose sets,result1包含的所有元素在[first1,last1)其不在[first2,last2),result2包含所有的元件在[first2,last2)其不在[first1,last1),并且result3包含在共同所有元件[first1,last1)[first2,last2).

的示例实现set_difference,并set_intersection从cplusplus.com看起来他们可以帮助我建立一个高效的实现仅进行一次扫描,而不是三个.但是,如果它在标准库中,我不想重新发明轮子.

例如,按要求:

给定两组a = {0,1,2,3,4}和b = {2,4,5,6}然后我想构建以下三组:

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

Bla*_*ace 3

没有标准库算法可以在一次扫描中完成此操作,但它很容易编写。以下内容看起来正确,并且输出在 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;
}
Run Code Online (Sandbox Code Playgroud)