2017-06-13 67 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; 
} 
相关问题