我试过找一个可以做std::inplace_merge
的算法
然后std::unique
会这样做。在1遍中比在2中更有效率。
无法在标准库中找到它或通过oogling找到它。
答案 0 :(得分:4)
它不会就地操作,但假设两个范围都没有预先包含重复项,std::set_union
将找到与merge相同的结果,后跟唯一。
答案 1 :(得分:4)
算法部分缺少许多有趣的算法。从Stepanov的观点来看,STL的原始提交是不完整的,甚至删除了一些算法。 Alexander Stepanov和Meng Lee的proposal似乎不包含算法inplace_merge_unique()
或其任何变体。
没有这种算法的一个潜在原因是不清楚应该删除哪个元素:由于比较只是严格的弱排序,因此元素的选择很重要。实现inplace_merge_unique()
的一种方法是
std::remove_if()
删除第二个范围内任何重复的元素。inplace_merge()
进行实际合并。 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;
}