2015-11-06 149 views
1

請考慮下面的一段代碼。我收到一個編譯錯誤。我應該如何編寫自定義比較函數。C++自定義成員比較功能

#include <iostream> 
#include <vector> 
#include <boost/cstdint.hpp> 
#include <utility> 
#include <algorithm> 


class X 
{ 
    public: 
    std::vector<std::pair<boost::uint64_t, boost::uint64_t> > vec; 
    bool cmp(const std::pair<boost::uint64_t, boost::uint64_t>& d1, 
     const std::pair<boost::uint64_t, boost::uint64_t>& d2); 
    void foo(void); 
    void print(void); 
}; 

bool X::cmp(const std::pair<boost::uint64_t, boost::uint64_t>& d1, 
    const std::pair<boost::uint64_t, boost::uint64_t>& d2) 
{ 
    return d1.first < d2.first; 
} 

void X::foo(void) 
{ 
    vec.push_back(std::make_pair(1000, 100)); 
    vec.push_back(std::make_pair(800, 200)); 
    std::sort(vec.begin(), vec.end(), cmp); 
} 

void X::print(void) 
{ 
    for (auto it = vec.begin(); it != vec.end(); ++it) 
    { 
    std::cout << it->first << std::endl; 
    } 
} 

    int 
main() 
{ 
    X x; 
    x.foo(); 
    x.print(); 
    return 0; 
} 

編譯錯誤:

g++ --std=c++11 custom_cmparator.cpp 

custom_cmparator.cpp: In member function ‘void X::foo()’: 
custom_cmparator.cpp:28:40: error: no matching function for call to  ‘sort(std::vector<std::pair<long unsigned int, long unsigned int> >::iterator, std::vector<std::pair<long unsigned int, long unsigned int> >::iterator, <unresolved overloaded function type>)’ 
std::sort(vec.begin(), vec.end(), cmp); 

我應該如何指定 的std ::排序(vec.begin(),vec.end(),CMP);

+2

出於好奇,爲什麼使用boost :: uint64_t中在從cstdint的類型?您似乎已經在使用C++ 11。 –

+0

這是項目配置的方式。 – gudge

回答

2

我將在此作爲備選答案,以防您不想使用靜態成員函數或非成員函數或lambda,如@Paul's response中所述。您可以使用std::bind#include <functional>

void X::foo(void) 
{ 
    using namespace std::placeholders; // for _1, _2 etc 

    vec.push_back(std::make_pair(1000, 100)); 
    vec.push_back(std::make_pair(800, 200)); 
    std::sort(vec.begin(), vec.end(), std::bind(&X::cmp, this, _1, _2)); 
} 
4

使其成爲靜態成員函數或非成員。

如果您需要訪問您的比較類成員(雖然你的例子並不需要它),你可以使用下面的評論或這樣的拉姆達提到的兩種方式:

std::sort(vec.begin(), vec.end(), 
    [this](const std::pair<boost::uint64_t, boost::uint64_t>& d1, 
      const std::pair<boost::uint64_t, boost::uint64_t>& d2) { 
       return this->cmp(d1, d2); 
    } 
); 
+0

如果它必須是一個成員並且是非靜態的? – gudge

+0

使用'std :: function'和'std :: bind'? –

+2

@gudge如果你看[這裏](http://en.cppreference.com/w/cpp/algorithm/find)的一個可能的實現,你可以看到,謂詞的調用是像任何函數調用,而不是通過一個成員函數,這將需要爲'Object :: MemberFunctionPtr'類型的'std :: find'重載。所以,長話短說,你不能使用成員函數,除非你通過例如['的std :: mem_fn'](http://en.cppreference.com/w/cpp/utility/functional/mem_fn)。 – vsoftco