C ++ / STL默认比较器

时间:2013-07-13 05:31:24

标签: c++ stl

我正在编写一个模板函数,它接受一个元素向量并对其执行一些操作序列。其中一个操作是std :: sort()。

当然,客户端代码需要提供比较器函子。如果它传入一个众所周知的类型(整数,字符串等)的容器,我不希望客户端代码为此参数指定值。我该如何定义Comp模板参数的默认值?

template<typename Container, typename Comp=????>
void my_func(Container elements, Comp comp) {
  ...
  std::sort(elements.begin(), elements.end(), comp);
  ...
}

4 个答案:

答案 0 :(得分:2)

std :: sort使用“Less”作为默认比较器。所以要保持一致:

template<typename Container, typename Comp = std::less<typename Container::value_type> >
void my_func(Container& elements, Comp comp = Comp())
{
  std::sort(elements.begin(), elements.end(), comp);
}

答案 1 :(得分:0)

#include <vector>
#include <algorithm>

template<typename Container, typename Comp=std::less<typename Container::value_type>>
void my_func(Container elements, Comp comp = Comp()) {
  //...
  std::sort(elements.begin(), elements.end(), comp);
  //...
}

int main() {
    std::vector<int> v;
    my_func(v);
}

另请注意Comp comp = Comp()

答案 2 :(得分:0)

我不会将模板本身,而是函数的参数分别默认为类似于std::greaterstd::less的{​​{1}}和><默认使用std::sort

如果你想获得它的模板参数,那么有一个建议让std::less适用于实际上被C ++ 14接受的称为N3421的通用类型。

但在此之前,您可以执行std::greater<>。如果愿意,您可以选择使用type_traits删除引用或cv限定符。

std::greater<typename Container::value_type>有其他默认比较,但这两者是最常见的。

所以“完整”的解决方案就是这样的:

<functional>

答案 3 :(得分:0)

在您的示例中有2个问题:

  1. 要制作默认行为,您必须将less<T>作为仿函数。

  2. 您的功能正在执行副本,因此,副本将进行排序,除非您对Container采取反对意见。

  3. 示例如何:

    #include <functional>
    template<typename Container, typename Comp=std::less<typename Container::value_type> >
    void my_func(Container &elements, Comp comp = Comp() )
    {
      std::sort(elements.begin(), elements.end(), comp);
    }
    // A partial specialisation for std::list
    #include <list>
    template<typename ContainerValueType, typename Allocator, typename Comp=std::less<ContainerValueType> >
    void my_func(std::list<ContainerValueType, Allocator> &elements, Comp comp = Comp() )
    {
      elements.sort(comp);
    }