2

std::sort是通过比较类参数化的模板。该函数本身将该类的一个对象作为参数,并“调用”它来比较待排序容器的元素。

我认为重要的是我们可以给 sort 一个具体的对象,而不是简单地让 sort 构造一个 Compare 对象本身。(如果不是,请纠正我。)

现在假设我们要实现一个函数,该函数将 a和 的比较函数foo作为输入:vector<T>T

template <class T, class Compare>
bool foo(const vector<T>& v, Compare comp);

作为此实现的一部分,我们希望对包含成对的不同向量进行排序T,例如,int对 a 进行排序vector<pair<T, int>>。但是我们只想根据T分量对这个向量进行排序。这意味着我们要将给定的订单提升T到订单上pair<T, int>并将该订单传递给std::sort.

不使用 lambdas 怎么办?我的问题是我看不到将Compare 对象T提升到一个 for 的方法pair<T, int>。我只能提升Compare ,然后构造一个对象,这意味着它foo会完全忽略它的comp论点。

谢谢。

4

1 回答 1

1

例如,您可以在函数内部定义一个局部结构吗?

template <class T, class Compare>

bool foo(const vector<T>& v, Compare comp)
{
   struct NewCompare
   {
      const Compare &rc;
      NewCompare( const Conpare &comp ) : rc( comp ) {}
      NewCompare( const NewCompare &comp ) : rc( comp.tc ) {}
      bool operator ()( const std::pair<T, int> &p1, const std::pair<T, int> &p2 ) const
      {
          return rc( p1.first, p2.first );
      }
    };

    //...
}

或者你可以编写一个通用的功能适配器。

于 2014-10-31T14:06:37.757 回答