为什么没有std :: inplace_merge是唯一的?

时间:2014-12-06 16:28:45

标签: c++ stl

我试过找一个可以做std::inplace_merge的算法 然后std::unique会这样做。在1遍中比在2中更有效率。 无法在标准库中找到它或通过oogling找到它。

  1. 那么在不同的名称下可能会在某处提升实现吗?
  2. 这样的算法是否可行(从某种意义上说,它具有与普通inplace_merge相同的复杂性保证)?

2 个答案:

答案 0 :(得分:4)

它不会就地操作,但假设两个范围都没有预先包含重复项,std::set_union将找到与merge相同的结果,后跟唯一。

答案 1 :(得分:4)

算法部分缺少许多有趣的算法。从Stepanov的观点来看,STL的原始提交是不完整的,甚至删除了一些算法。 Alexander Stepanov和Meng Lee的proposal似乎不包含算法inplace_merge_unique()或其任何变体。

没有这种算法的一个潜在原因是不清楚应该删除哪个元素:由于比较只是严格的弱排序,因此元素的选择很重要。实现inplace_merge_unique()的一种方法是

  1. 使用std::remove_if()删除第二个范围内任何重复的元素。
  2. 使用inplace_merge()进行实际合并。
  3. std::remove_if()的谓词将跟踪要合并的序列的第一部分中的当前位置。下面的代码没有经过测试,但是这样的代码应该有效:

    template <typename BiDirIt, typename Comp>
    BiDirIt inplace_merge_unique(BiDirIt begin, BiDirIt middle, BiDirIt end, Comp comp) {
        using reference = typename std::iterator_traits<BiDirIt>::reference;
        BiDirIt result = std::remove_if(middle, end, [=](reference other) mutable -> bool {
                begin = std::find_if(begin, middle, [=](reference arg)->bool {
                        return !comp(arg, other);
                    });
                return begin != middle && !comp(other, *begin);
            });
        std::inplace_merge(begin, middle, result, comp);
        return result;
    }