Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否存在具有用户定义的冲突处理程序的std::unique样式库算法?_C++_Algorithm_Unique_Reduce - Fatal编程技术网

C++ 是否存在具有用户定义的冲突处理程序的std::unique样式库算法?

C++ 是否存在具有用户定义的冲突处理程序的std::unique样式库算法?,c++,algorithm,unique,reduce,C++,Algorithm,Unique,Reduce,我有一个键/值对的基本std::vector。它是按键排序的。我希望在压缩向量时使用用户定义的二进制运算符减少所有相邻的重复键条目 这基本上是一个std::unique应用程序,用户可以在其中决定如何处理冲突,而不仅仅是保留第一个条目 是否有满足此要求的库算法?我可以自己写,但我更愿意依靠专家写的东西 作为排序向量的映射是算法其他部分的核心,不能更改。我只能使用C++14。我想不出一个标准的算法来实现这一点。std::unique几乎满足要求,但不幸的是,您提供用于比较元素的BinaryPred

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

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

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


作为排序向量的映射是算法其他部分的核心,不能更改。我只能使用C++14。我想不出一个标准的算法来实现这一点。std::unique几乎满足要求,但不幸的是,您提供用于比较元素的BinaryPredicate不允许修改它们。binary_pred不应通过解引用迭代器应用任何非常量函数。-[algorithms.requirements]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;
}
返回值将是压缩向量的新端点-您可以从中删除,就像删除\u一样


您可以看到它正在运行。

我可以合理地确定,该标准没有包含专门用于您概述的任务的算法。是的,谢谢@Tony,这个解决方法基本上就是我一直在使用的。