Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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++ C++;用于对参数进行就地排序的变量函数_C++_Sorting_Variadic_In Place - Fatal编程技术网

C++ C++;用于对参数进行就地排序的变量函数

C++ C++;用于对参数进行就地排序的变量函数,c++,sorting,variadic,in-place,C++,Sorting,Variadic,In Place,在实现二进制搜索问题的变体时,我需要重新排序切片点(即开始、中间、结束),以便它们存储在相应的变量中(例如(1,5,2)->(1,2,5))。这对于一些if语句和交换来说相当简单。然而,作为一个思维实验,我现在有兴趣将其推广到n许多T类型变量。我开始尝试一些直观的解决方案,作为起点,我提出了以下模板功能: template<typename T> void sortInPlace( std::function<bool (const T&, const T&a

在实现二进制搜索问题的变体时,我需要重新排序切片点(即开始、中间、结束),以便它们存储在相应的变量中(例如
(1,5,2)->(1,2,5)
)。这对于一些
if语句和
交换
来说相当简单。然而,作为一个思维实验,我现在有兴趣将其推广到
n
许多
T
类型变量。我开始尝试一些直观的解决方案,作为起点,我提出了以下模板功能:

template<typename T>
void 
sortInPlace(
    std::function<bool (const T&, const T&)> compareFunc,
    T& start, 
    T& mid, 
    T& end)
    {
        std::vector<T> packed {start, mid, end};
        std::sort(packed.begin(), packed.end(), compareFunc);
        auto packedAsTuple = make_tuple(packed[0], packed[1], packed[2]);
        std::tie(start, mid, end) = packedAsTuple;
    }
理想情况下,下面的步骤是将此模板转换为可变模板,但我很难实现这一点。关于当前版本,我也有一些困扰我的事情:

  • 使用
    std::vector
    是一个任意的决定。我这样做是因为我不清楚在包装这些价值时最好使用什么结构/容器。在我看来,结构的选择需要很容易地构造、排序和解包/转换为元组,我不确定是否存在这样一个神奇的结构
  • 为了让事情进展顺利,我不得不手动打包/解包参数。我也不清楚如何使用
    std::tie
    或任何其他元素编号可变(即编译时未知)的解包/移动操作
  • 虽然没有特别的理由专门使用stl函数/结构,但我会惊讶地发现,使用stl中提供的抽象并没有直观的方法来实现这一点。因此,我对使用stl之外的最小帮助来实现我的目标更感兴趣

  • 我开始了这个思维实验,希望最终得到语法正确的
    std::move(std::sort({x,y,z},comp),{x,y,z})
    ,考虑到我的研究迄今为止给我带来了什么,我开始认为我把这个问题复杂化了。任何帮助、见解或建议都将不胜感激

    一个可能的C++17解决方案,带有
    std::sort
    ,它概括了您的示例:

    template<class Comp, class... Ts>
    void my_sort(Comp comp, Ts&... values) {
        using T = std::common_type_t<Ts...>;
        T vals[]{std::move(values)...};
    
        std::sort(std::begin(vals), std::end(vals), comp);
    
        auto it = std::begin(vals);
        ((values = std::move(*it++)), ...);
    }
    
    using Pivot = std::pair<int, int>;
    
    const auto comp = [](Pivot a, Pivot b) {
        return std::get<0>(a) < std::get<0>(b);
    };
    
    Pivot a(8, 1);
    Pivot b(2, 3);
    Pivot c(4, 6);
    
    my_sort(comp, a, b, c);
    
    模板
    作废我的排序(组件、Ts和…值){
    使用T=std::common\u type\u T;
    T vals[]{std::move(值)…};
    标准::排序(标准::开始(VAL)、标准::结束(VAL)、组件);
    自动it=标准::开始(VAL);
    ((values=std::move(*it++),…);
    }
    使用Pivot=std::pair;
    常数自动补偿=[](轴a、轴b){
    返回std::get(a)

    如果包中的
    N
    参数数量很少,则根本不需要
    std::sort
    。只需一系列(硬编码的)比较(对于较小的
    N
    来说,精确地知道比较的最小数量)就可以完成这项工作-参见第节。5.3 Knuth的TAOCP第3卷的最佳排序。

    感谢您的快速响应。看了你的解决方案后,我意识到我对C++的现代特性的想法比我想象的要少。我甚至不知道折叠表达式是在c++17中引入的!从那以后我一直在温习它。
    a after sort: 2, 3
    b after sort: 4, 6
    c after sort: 8, 1
    
    template<class Comp, class... Ts>
    void my_sort(Comp comp, Ts&... values) {
        using T = std::common_type_t<Ts...>;
        T vals[]{std::move(values)...};
    
        std::sort(std::begin(vals), std::end(vals), comp);
    
        auto it = std::begin(vals);
        ((values = std::move(*it++)), ...);
    }
    
    using Pivot = std::pair<int, int>;
    
    const auto comp = [](Pivot a, Pivot b) {
        return std::get<0>(a) < std::get<0>(b);
    };
    
    Pivot a(8, 1);
    Pivot b(2, 3);
    Pivot c(4, 6);
    
    my_sort(comp, a, b, c);