其他分享
首页 > 其他分享> > c – 如何重载自定义std :: sort比较函数?

c – 如何重载自定义std :: sort比较函数?

作者:互联网

使用std :: sort时,如何重载我正在使用的自定义比较函数?

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

class Misc {
public:
  // Comment out the next three lines to compile without problems.
  static bool sortPair(const std::pair<int, int> &a, const std::pair<int, int> &b){
    return a.first < b.first;
  }
  static bool sortPair(const std::pair<double, std::string> &a, const std::pair<double, std::string> &b){
    return a.first < b.first;
  }
};

int main () {
  std::vector<std::pair<double, std::string> > u;
  u.push_back(std::make_pair(10.0, "ten"));
  u.push_back(std::make_pair(5.0, "five"));
  u.push_back(std::make_pair(1.0, "one"));

  std::sort(u.begin(), u.end(), Misc::sortPair);

  for (unsigned int i=0; i< u.size(); i++){
    std::cout << u.at(i).first << std::endl;
  }

  return 0;
}

因为它抱怨我无法得到这个编译:

unresolved overloaded function type

我可以看到使用sortPair可能有些含糊不清,但我认为编译器能够根据与向量u关联的类型来解决这个问题.有没有什么方法可以指定使用哪个函数/方法来消除问题的歧义?

目前,注释掉第一个sortPair函数允许编译代码并生成正确的排序输出.当然,这是因为它不再含糊不清.

解决方法:

由于u是std :: pair< double,std :: string>的向量,因此您需要调用相应的比较函数.由于仅仅名称是不够的,因此必须通过将其转换为具有正确函数指针类型的指针来为编译器消除歧义.在你的情况下,它是一个函数,它对对类型采用两个const引用并返回一个bool – 所以你必须强制转换为的函数指针类型:

bool (*)(const std::pair<int, int> &, const std::pair<int, int> &)

这是一个非常丑陋的演员:

std::sort(u.begin(), u.end(), static_cast<bool (*)(const std::pair<int, int> &, const std::pair<int, int> &)>(&Misc::sortPair));

哇.

最好使用一些typedef来澄清你在做什么:

//includes as they were...
typedef std::pair<double, std::string> dsPair; //or something more meaningful

class Misc {
public:
  //Comment out the next three lines to compile without problems
  static bool sortPair(const std::pair<int, int> &a, const std::pair<int, int> &b){
    return a.first < b.first;
  }
  static bool sortPair(dsPair const& a, dsPair const& b){
    return a.first < b.first;
  }
};

int main () {
  std::vector<dsPair> u{ 
    {10.0, "ten"},
    {5.0, "five"},
    {1.0, "one"}
  };

  /** the function pointer typedef
   * It takes a bit getting used to, but no worries, 
   * you won't have to do it THAT often:
   **/
  typedef bool(*dsPairCompFunc)(dsPair const&, dsPair const&); 

  //and now the cast is much clearer:
  std::sort(begin(u), end(u), static_cast<dsPairCompFunc>(&Misc::sortPair));

  for (auto& e : u){
    std::cout << e.first << "\n";
  }

  return 0;
}

如果您的编译器支持,我将一些旧的C 03内容更改为C 11.

标签:std-pair,c,sorting,vector,stdvector
来源: https://codeday.me/bug/20190831/1774900.html