2017-06-13 76 views
0

我有一個類「PclProc」,我想使用std :: sort。std ::使用同一類中的成員函數進行排序?

我在同一個類中編寫了一個比較函數,因爲這個比較需要「in_ptr」,它是同一類中的一個變量。

但我一樣以下,總有一個錯誤:函子

error: no matching function for call to ‘sort(std::vector::iterator, std::vector::iterator, )’ std::sort(cloud_indice.indices.begin(),cloud_indice.indices.end(),PclProc::MyCompare);

bool PclProc::MyCompare(int id1, int id2) 
{ 
    return in_ptr->points[id1].z<in_ptr->points[id2].z; 
} 


float PclProc::MedianZDist(pcl::PointIndices cloud_indice) 
{ 
    std::sort(cloud_indice.indices.begin(),cloud_indice.indices.end(),PclProc::MyCompare); 
    int size=cloud_indice.indices.size(); 
    float median_x,median_y; 
... 
+0

std :: sort不能用於普通的成員函數。如果C++編譯器支持lambda函數,則可以使用函數運算符(函子)或lambda函數。有關於此的前線程,如[this one](https://stackoverflow.com/questions/37767847/stdsort-function-with-custom-compare-function-results-error-reference-to-non)。 – rcgldr

+0

@rcgldr謝謝。我的情況是C++ 11不可用。所以lambda函數不能使用。我知道函數操作符超載。但是你能否給我更多關於如何爲我的特例寫信的提示? – user7487638

回答

0

例被用於性病::排序。向量D是數據,向量I是D的索引。我使用函子根據D對std :: sort進行排序。 std :: sort只創建一個類lessthan的實例,然後爲所有比較使用該實例。

#include <algorithm> 
#include <cstdlib> 
#include <iostream> 
#include <iomanip> 
#include <vector> 

typedef unsigned int uint32_t; 

#define SIZE 16 

class example{ 
public: 
    std::vector<uint32_t> D; // data 
    std::vector<uint32_t> I; // indices 

example(void) 
{ 
    D.resize(SIZE); 
    I.resize(SIZE); 
    for(uint32_t i = 0; i < SIZE; i++){ 
     D[i] = rand()%100; 
     I[i] = i; 
    } 
} 

void displaydata(void) 
{ 
    for(size_t i = 0; i < SIZE; i++) 
     std::cout << std::setw(3) << D[I[i]]; 
    std::cout << std::endl; 
} 

class lessthan     // lessthan functor for std::sort 
{ 
public: 
const example &x; 
    lessthan(const example &e) : x(e) { } 
    bool operator()(const uint32_t & i0, const uint32_t & i1) 
    { 
     return x.D[i0] < x.D[i1]; 
    } 
}; 

void sortindices(void) 
{ 
    std::sort(I.begin(), I.end(), lessthan(*this)); 
} 
}; 

int main() 
{ 
example x; 
    x.displaydata(); 
    x.sortindices(); 
    x.displaydata(); 
    return 0; 
} 
相關問題