C++ 函数,该函数使用模板分配器和对对对向量进行排序
这是我的函数,它根据向量对的第一个元素对向量进行排序 std::vector 排序对(标准::向量和项目) { std::sort(std::begin(items),std::end(items)); 退货项目; } 但是,当我尝试将它推广到接受任何类型的分配器和分配对的任何类型时,我得到了一堆错误(太多了,无法粘贴到这里)。我使用右值引用作为参数,因为该函数是在其他函数中调用的,而copy参数也可以工作,但我认为效率较低。以下是我尝试过的一些方法C++ 函数,该函数使用模板分配器和对对对向量进行排序,c++,templates,c++20,C++,Templates,C++20,这是我的函数,它根据向量对的第一个元素对向量进行排序 std::vector 排序对(标准::向量和项目) { std::sort(std::begin(items),std::end(items)); 退货项目; } 但是,当我尝试将它推广到接受任何类型的分配器和分配对的任何类型时,我得到了一堆错误(太多了,无法粘贴到这里)。我使用右值引用作为参数,因为该函数是在其他函数中调用的,而copy参数也可以工作,但我认为效率较低。以下是我尝试过的一些方法 模板 分配器排序对(分配器和项) { st
模板
分配器排序对(分配器和项)
{
std::sort(std::begin(items),std::end(items));
退货项目;
}
如果您能在代码中添加一些c++20提示,我将不胜感激。类似于需求。为了表示您的
分配器,您应该使用的是一个“”
如下
template <template <typename...> class Allocator,
typename P1, typename P2>
Allocator<std::pair<P1, P2>>
sort_pairs (Allocator<std::pair<P1, P2>> && items)
{
std::sort(std::begin(items),std::end(items));
return items;
}
但是类
仍然有效,而且更可取
请注意分配器
截取std::vector
(模板类,而不是像std::vector
那样的特定专门化),因此无法像示例中那样从中提取P1
和P2
// ....................VVVVVVVVV not usable this way
typename P1 = typename Allocator::value_type::first_type
你应该写
typename Allocator<std::pair<P1, P2>>::value_type::first_type
typename分配器::值\u类型::第一个\u类型
但是,显然,您不能使用它为P1
提供默认类型,因为您必须知道P1
幸运的是,P1
和P2
可以从items
参数中推导出来,因此您不需要默认类型。表示分配器的方法应该是一个“”
如下
template <template <typename...> class Allocator,
typename P1, typename P2>
Allocator<std::pair<P1, P2>>
sort_pairs (Allocator<std::pair<P1, P2>> && items)
{
std::sort(std::begin(items),std::end(items));
return items;
}
但是类
仍然有效,而且更可取
请注意分配器
截取std::vector
(模板类,而不是像std::vector
那样的特定专门化),因此无法像示例中那样从中提取P1
和P2
// ....................VVVVVVVVV not usable this way
typename P1 = typename Allocator::value_type::first_type
你应该写
typename Allocator<std::pair<P1, P2>>::value_type::first_type
typename分配器::值\u类型::第一个\u类型
但是,显然,您不能使用它为P1
提供默认类型,因为您必须知道P1
幸运的是,可以从items
参数推断出P1
和P2
,因此您不需要默认类型。底层类型是成对的吗?算法的主体并没有以任何方式利用这一点。我们可以从以下几点开始:
template <typename R>
std::decay_t<R> sort(R&& items)
{
std::sort(std::begin(items),std::end(items));
return items;
}
如果确实需要这是一个对范围,可以将其作为单独的约束添加:
template <std::ranges::range R>
requires std::sortable<std::ranges::iterator_t<R>> &&
is_specialization_of<std::ranges::range_value_t<R>, std::pair>
std::decay_t<R> sort(R&& items)
{
std::sort(std::ranges::begin(items), std::ranges::end(items));
return items;
}
模板
需要std::可排序&&
你是专业化的吗
标准::衰减\u t排序(R&t项)
{
std::sort(std::ranges::begin(items),std::ranges::end(items));
退货项目;
}
我将把的实现作为练习 底层类型是成对突出的事实吗?算法的主体并没有以任何方式利用这一点。我们可以从以下几点开始:
template <typename R>
std::decay_t<R> sort(R&& items)
{
std::sort(std::begin(items),std::end(items));
return items;
}
如果确实需要这是一个对范围,可以将其作为单独的约束添加:
template <std::ranges::range R>
requires std::sortable<std::ranges::iterator_t<R>> &&
is_specialization_of<std::ranges::range_value_t<R>, std::pair>
std::decay_t<R> sort(R&& items)
{
std::sort(std::ranges::begin(items), std::ranges::end(items));
return items;
}
模板
需要std::可排序&&
你是专业化的吗
标准::衰减\u t排序(R&t项)
{
std::sort(std::ranges::begin(items),std::ranges::end(items));
退货项目;
}
我将把的实现作为练习 TBH看起来像是带有额外步骤的std::sort
。你能解释一下你的动机吗?如果这是一个方便的函数,你能不能只T&&items
?动机就是提高我的编码技能(函数编程),只使用std::sort就可以达到同样的效果,但是使用更多的参数?TBH看起来像是std::sort
,需要额外的步骤。你能解释一下你的动机吗?如果这是一个方便的函数,你能不能只T&&items
?其动机只是提高我的编码技能(函数编程),使用std::sort可以获得相同的结果,但需要更多的参数?@ElGusanito首先,仅仅说它不起作用是没有帮助的。具体来说,什么不起作用?其次,(一旦我在迭代器\u t
上修复了名称空间,但那不是演绎失败,所以我不确定你指的是什么)。问题是编译器在所有解决方案中都显示了相同的错误(演绎模板失败),即使启用了c++20(cl.exe),在gcc中工作得很好,谢谢,对不起。@ElGusanito首先,仅仅说它不工作是没有帮助的。具体来说,什么不起作用?其次,(一旦我在迭代器\u t
上修复了名称空间,但那不是演绎失败,所以我不确定你指的是什么)。问题是编译器在所有解决方案中都显示了相同的错误(演绎模板失败),即使启用了c++20(cl.exe),在gcc中工作很好,谢谢和抱歉。抱歉,但是你提供的示例不起作用,这里是godbolt链接,请告诉我我是否执行了你的函数@ElGusanito——我的例子很有效;你这样称呼我的例子是行不通的。函数(如您的问题所示)等待(&&&
)r值引用。所以不能用l值引用来调用它(my_sort(v);
)。您必须在函数中接受l值引用(&
而不是&
),或者必须传递r值引用(my_sort(std::move(v));
)。但是如果你在v
上使用std::move()
,你就不能在它之后使用它(如果我没记错的话,没有定义的行为),所以你必须将返回的值复制到一个新的向量,所以autov2=my_sort(std::move(v))编码>并循环v2
,而不是v
。对不起,谢谢,多亏了您的awnser,我学到了很多关于模板的知识。@ElGusanito-不客气。重要的是你已经学会了。对不起,你提供的例子