2

我试图使用排序函数对包含比较它们的第二个值的对的列表进行排序。这就是我正在使用的:

std::sort(score_list.begin(), score_list.end(), compare_pair);

这是排序功能:

bool Highscore::compare_pair (std::pair<std::string, int> first, std::pair<std::string, int> second)

{
  if (first.second<second.second) return true;
  else return false;
}

我收到此错误消息:

error: no matching function for call to ‘sort(std::list<std::pair<std::basic_string<char>, int> >::iterator, std::list<std::pair<std::basic_string<char>, int> >::iterator, <unresolved overloaded function type>)’

有什么建议吗?谢谢

4

3 回答 3

3

您不能直接将成员函数作为比较器传递。使用函数时,实际传递的是指向函数的指针——但指向函数的指针与指向成员函数的指针完全不同。

C++98/03 有几个命名的适配器mem_funmem_fun_ref它们(有点)处理这个问题。

C++11 添加mem_fn和弃用mem_funand mem_fun_ref. 假设你有一个足够新的编译器来包含它,它会更容易使用。

但是,如果您的编译器是新的,那么它可能还会包含 lambda,这可以使任务变得相当干净,因为您可以使用函数对象的“就地”定义来处理比较:

typedef std::pair<std::string, int> data_t;

std::sort(score_list.begin(), score_list.end(),
    [](data_t const &a, data_t const &b) { 
        return a.second < b.second; 
    });

如果你用谷歌搜索“C++11 lambda”之类的东西,你应该会找到更多关于这个的信息(其中大部分几乎肯定会直接回到这里)。

于 2012-12-13T02:39:27.953 回答
2

此外,您几乎肯定希望通过 const 引用而不是按值将这些对传递给您的排序函数。

static bool Highscore::compare_pair (const std::pair<std::string, int> &first, const std::pair<std::string, int> &second)

并且typedef是你的朋友。

于 2012-12-13T02:39:33.920 回答
1

如果要对 a 进行排序std::list,则应该使用std::list::sort成员函数。该std::sort算法需要随机访问迭代器并且std::list只提供双向迭代器

于 2012-12-13T03:18:48.790 回答