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);