是否有具有用户定义的冲突处理程序的 std::唯一样式库算法

Is there a std::unique-style library algorithm that has user-defined collision handler?

本文关键字:唯一 算法 std 样式 处理 用户 定义 冲突 是否 程序      更新时间:2023-10-16

我有一个基本的 std::键/值对向量。它按键排序。我想在压缩向量的同时使用用户定义的二进制运算符减少所有相邻的重复键条目。

这基本上是一个 std::unique 应用程序,用户可以在其中决定如何处理冲突,而不仅仅是保留第一个条目。

是否有满足此要求的库算法?我可以自己写,但我更愿意依靠专家写的东西。

按排序的地图向量是算法其他部分的核心,无法更改。我仅限于C++14。

我想不出一个标准的算法。 std::unique几乎满足了要求,但不幸的是,您提供的用于比较元素的 BinaryPredicate 不允许修改它们("binary_pred不得通过取消引用的迭代器应用任何非常量函数。 - [算法.要求] C++17 标准(中的第 7 段 - 允许实现更自由地优化的要求(例如,向量不同部分的并行处理(。

不过实现并不太难...

template <typename Iterator, typename BinaryPredicate, typename Compaction>
Iterator compact(Iterator begin, Iterator end, BinaryPredicate equals, Compaction compaction)
{
    if (begin == end) return begin;
    Iterator compact_to = begin;
    while (++begin != end)
        if (equals(*begin, *compact_to))
            compaction(*compact_to, *begin);
        else
            *++compact_to = *begin;
    return ++compact_to;
}

返回值将是压缩向量的新"结束" - 您可以像remove_if一样从中erase

您可以在此处看到它正在运行。