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++17中编写constexpr快速排序?_C++_Sorting_C++17_Constexpr - Fatal编程技术网

如何在c++17中编写constexpr快速排序?

如何在c++17中编写constexpr快速排序?,c++,sorting,c++17,constexpr,C++,Sorting,C++17,Constexpr,如何在c++17中编写constexpr快速排序?为什么我的代码不起作用? g++输出: /Users/user1/tests/test22.cpp:318:19:错误:constexpr变量“leftSize”必须由常量表达式初始化 constexpr size\u t leftSize=GetLeftSizearray; ^ ~~~~~~~~~~~~~~~~~~ /Users/user1/tests/test22.cpp:327:27:注意:在函数模板专门化的实例化中,此处

如何在c++17中编写constexpr快速排序?为什么我的代码不起作用? g++输出:

/Users/user1/tests/test22.cpp:318:19:错误:constexpr变量“leftSize”必须由常量表达式初始化 constexpr size\u t leftSize=GetLeftSizearray; ^ ~~~~~~~~~~~~~~~~~~ /Users/user1/tests/test22.cpp:327:27:注意:在函数模板专门化的实例化中,此处请求“快速排序” constexpr auto array13=QuickSortarray12; ^ /Users/user1/tests/test22.cpp:318:42:注意:常量表达式中不允许读取非constexpr变量“array” constexpr size\u t leftSize=GetLeftSizearray; ^ /Users/user1/tests/test22.cpp:318:42:注意:调用'arrayarray' /Users/user1/tests/test22.cpp:319:26:错误:非类型模板参数不是常量表达式 constexpr std::array left=QuickSortSliceLeftarray; ^~~~~~~~ /Users/user1/tests/test22.cpp:319:26:注意:“leftSize”的初始值设定项不是常量表达式 /Users/user1/tests/test22.cpp:318:19:注意:在这里声明 constexpr size\u t leftSize=GetLeftSizearray; ^ /Users/user1/tests/test22.cpp:327:17:错误:constexpr变量“array13”必须由常量表达式初始化 constexpr auto array13=QuickSortarray12; ^~~~~~~~~~~~~~~~~~~

这是我的代码:

#include <array>

template<typename T, size_t N>
constexpr size_t GetLeftSize(const std::array<T, N> array)
{
    T f = array[0];
    size_t n = 1;
    for (size_t i = 1; i < N; i ++)
        if (array[i] <= f)
            n ++;

    return n;
}

// Get Left Slice
template<typename T, size_t N, size_t L>
constexpr std::array<T, L> SliceLeft(const std::array<T, N> array)
{
    std::array<T, L> result{};
    for (size_t i = 0; i < L; i ++)
        result[i] = array[i];
    return result;
}

// Get Right Slice
template<typename T, size_t N, size_t R>
constexpr std::array<T, R> SliceRight(const std::array<T, N> array)
{
    std::array<T, R> result{};
    for (size_t i = 0; i < R; i ++)
        result[i] = array[N - i];
    return result;
}

// Link Sclice
template<typename T, size_t L, size_t R>
constexpr std::array<T, L + R> LinkSlice(const std::array<T, L> left, const std::array<T, R> right)
{
    std::array<T, L + R> result{};

    for (size_t i = 0; i < L; i ++)
        result[i] = left[i];

    for (size_t i = 0; i < L; i ++)
        result[L + i] = right[i];

    return result;

}

// Quick sort function
template<typename T, size_t N>
constexpr const std::array<T, N> QuickSort(const std::array<T, N> array)
{
    if (N <= 1)
        return array;
    constexpr size_t leftSize = GetLeftSize(array);
    constexpr std::array<T, leftSize> left = QuickSort(SliceLeft<T, N, leftSize>(array));
    constexpr std::array<T, N - leftSize> right = QuickSort(SliceRight<T, N, N - leftSize>(array));
    return LinkSlice(left, right);
}

int main()
{   
    constexpr std::array<int, 6> array12{7, 9, 3, 6, 1, 19};
    constexpr auto array13 = QuickSort(array12);
    return 0;
}
函数QuickSort中的参数数组不是constexpr变量,但它将使用constexpr参数array12初始化,因此不能使用它初始化constexpr变量leftSize

事实上,constexpr函数可以修改其参数,因此可以像普通函数一样实现快速排序:

#include <array>

template<typename T, std::size_t N>
constexpr void QuickSort(std::array<T, N> &array, std::size_t low, std::size_t high)
{
    if (high <= low) return;
    auto i = low, j = high + 1;
    auto key = array[low];
    for (;;) {
        while (array[++i] < key) if (i == high) break;
        while (array[--j] > key) if (j == low) break;
        if (i >= j) break;

        auto tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;

    }

    auto tmp = array[low];
    array[low] = array[j];
    array[j] = tmp;

    QuickSort(array, low, j - 1);
    QuickSort(array, j + 1, high);
}

template<typename T, std::size_t N>
constexpr std::array<T, N> QuickSort(std::array<T, N> array)
{
    QuickSort(array, 0, N - 1);
    return array;
}

int main()
{   
    constexpr std::array<int, 6> array12{7, 9, 3, 6, 1, 19};
    constexpr auto array13 = QuickSort(array12);
    return 0;
} 

还请注意,由于C++20已经是constexpr。

编译器输出告诉您,您正在执行constexpr方法中不允许的操作。