带比较器的STL排序功能

时间:2016-04-22 15:02:46

标签: c++ stl

这是一个语法问题。

C++ STL sort function

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

文档说comp可以是函数指针或对象。

但是如果传递函数指针,C ++的哪种机制允许使用函数指针代替对象,即Compare comp

为什么不是编译错误?

1 个答案:

答案 0 :(得分:2)

给定一个带有函数调用操作符的对象

struct Functor {

  bool operator()(const Foo& a, const Foo& b) {
    return a < b;
  }

};

很容易看到sort函数可以实例化,以便Compare comp参数接受Functor对象。

sort(/* other params we don't care about here */, Functor comp);

足够公平。

你的问题是 - 这怎么能接受一个函数指针?让我们先来看一下函数指针的类型是什么?

考虑以下

bool compare(const Foo& a, const Foo& b);
bool (*func_ptr)(const Foo&, const Foo&) = compare;

指向函数compare的指针类型,如上面第二行所示,是bool (*)(const Foo&, const Foo&)。你可以像任何其他类型一样输入dede:

typedef bool (*func_ptr_type)(const Foo&, const Foo&);
func_ptr_type ptr = compare;

或等效地:

using func_ptr_type = bool(*)(const Foo&, const Foo&);
func_ptr_type ptr = compare;

现在,当你提供一个指向std::sort的函数指针时,显然类型Compare成为指针类型,类似于上面的func_ptr_type,并且参数看起来很多与第二行中的示例相同:

sort(/* other params we don't care about here */, func_ptr_type comp);

这一切都有效,因为sort函数实际上是一个函数模板。它根据其用途使用不同类型进行实例化。当它用对象实例化时,它的参数按值接受该对象(Compare类型被推断为对象的类型)。当使用函数指针实例化时,Compare类型被推断为函数指针类型。