【问题标题】:Different sort methods with template collection具有模板集合的不同排序方法
【发布时间】:2017-06-03 03:09:48
【问题描述】:

如果这个论坛上已经存在类似的问题,我很抱歉,如果可以的话,请给我链接。

我有一个模板类

template<typename type>
class DoublyLinkedList {};

我想在里面加入 Sort 方法。

template<typename type>
class DoublyLinkedList
{
public:

void Sort(){}

};

但是列表是模板,所以它可以包含不同的类型。那么如何为我预见的所有类型创建方法呢?我是这样尝试的:

template<typename type>
class DoublyLinkedList
{
public:

void DoublyLinkedList<int>::Sort(){}
void DoublyLinkedList<string>::Sort(){} 

};

但这是错误的。请帮忙。

【问题讨论】:

  • 你可以像std::list::sort那样做。
  • 只需使用标准 C++ 容器。 Stack Overflow 不是一个“论坛”。
  • @ChristianHackl 那么,这不可能吗?我想有自己的实现。
  • 我知道我可以用一种方法做到这一点,然后再识别列表类型,但我问的是两种方法。
  • @Michael:当然有可能。请参阅@NathanOliver 的评论。像std::list 那样做,并允许用户提供一个默认为std::less 的函子。但这是一件完全无趣的事情,因为它重新发明了轮子,并且将是一个不如std::list 的解决方案,除了扔掉它并改用std::list 之外没有什么可做的。

标签: c++ list sorting templates


【解决方案1】:

标准库一般处理这个问题的方式是允许用户指定自己的比较函数。您可以添加一个模板化参数,您的类型的用户可以使用它来提供比较功能,就像std::sort 所做的那样。在排序的实现中,您假设comparer 是一个比较列表的两个元素并返回第一个是否应该在第二个之前的函数。

#include <string>
template<typename type>
class DoublyLinkedList
{
public:
    template<class Comp>
    void Sort(Comp comparer);

};

void foo(DoublyLinkedList<std::string> & list)
{
    // Sort list by length of strings
    list.Sort([](const std::string p_left, const std::string p_right){
        return p_left.size() < p_right.size();
    });
}

【讨论】:

  • 我会将compare 默认为std::less&lt;type&gt;,这样您就不必总是提供函子。
  • 您的代码看起来非常清晰和专业,您对此有何看法? pastebin.com/6rSJfF4Z我知道这段代码不好。
  • @Michael 这种方法在实践中是行不通的。只要您支持的类型具有兼容的接口,它就会起作用。这意味着只能对您的type 执行适用于intstd::string所有您选择支持的其他类型的操作。请记住,即使只采用您的一个分支,它们都必须为您支持的所有type 编译。例如,您无法访问 string 中的字符,因为当您尝试使用 int 进行实例化时,将无法找到 int 类型的 operator[]
  • @Michael 我已经修改了您的示例以说明为什么它不能工作。 pastebin
  • @FrançoisAndrieux 好的,谢谢!你能告诉我我必须在 Sort() 方法中使用该 lambda 做什么来对 int 进行排序吗?如果我有那个 lambda 作为参数:pastebin.com/DAVjCqWP 我不知道如何在 Sort() 中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多