Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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++_Templates_C++20 - Fatal编程技术网

C++ 函数,该函数使用模板分配器和对对对向量进行排序

C++ 函数,该函数使用模板分配器和对对对向量进行排序,c++,templates,c++20,C++,Templates,C++20,这是我的函数,它根据向量对的第一个元素对向量进行排序 std::vector 排序对(标准::向量和项目) { std::sort(std::begin(items),std::end(items)); 退货项目; } 但是,当我尝试将它推广到接受任何类型的分配器和分配对的任何类型时,我得到了一堆错误(太多了,无法粘贴到这里)。我使用右值引用作为参数,因为该函数是在其他函数中调用的,而copy参数也可以工作,但我认为效率较低。以下是我尝试过的一些方法 模板 分配器排序对(分配器和项) { st

这是我的函数,它根据向量对的第一个元素对向量进行排序

std::vector 排序对(标准::向量和项目) { std::sort(std::begin(items),std::end(items)); 退货项目; } 但是,当我尝试将它推广到接受任何类型的分配器和分配对的任何类型时,我得到了一堆错误(太多了,无法粘贴到这里)。我使用右值引用作为参数,因为该函数是在其他函数中调用的,而copy参数也可以工作,但我认为效率较低。以下是我尝试过的一些方法

模板
分配器排序对(分配器和项)
{
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-不客气。重要的是你已经学会了。对不起,你提供的例子