使用 std::sort 对具有结构对的列表进行排序

Sorting a list with struct pair using std::sort

本文关键字:列表 排序 std sort 使用 结构      更新时间:2023-10-16

我想对结构列表、迭代器和双精度值的对结构进行排序;

以上是我的尝试。我的结构是

    template<class Iterator>
struct Pair{
    double distance; 
    Iterator iterator; };

我的排序功能是;

template<class SetIterator>
        static bool MyDataSortPredicate(const Pair<SetIterator>& lhs, const Pair<SetIterator>& rhs){
            return lhs.distance < rhs.distance;
        }

创建结构体值列表;它是distance_pair的,请注意它的类型。

 template<class SetIterator>
std::vector<Pair<SetIterator> > createSortedPointDistancePairs( 
    SetIterator begin, SetIterator end,Vector const& query ){
    std::vector<double> it(std::distance(begin,end));
    std::vector<double>::iterator iter;
    std::vector<Pair<SetIterator> > distance_pair(std::distance(begin,end)); //to make space
    computeDistances(begin,  end, query, it.begin());
    SetIterator pos = begin;
    int i = 0;
    for(iter = it.begin(); iter!=it.end();++iter,i++){
        if (pos!=end){
            Pair<SetIterator> set;
            set.distance = *iter;
            set.iterator = pos;
            distance_pair[i] = set;
            }
        ++pos;
    }

现在,我倾向于制作一个排序结构列表,其中距离的顺序在值中相加,使用我的比较函数MyDataSortPredicate,

std::sort(distance_pair.begin(),distance_pair.end(),MyDataSortPredicate);

错误是:

 error: no matching function for call to 'sort'
        std::sort(distance_pair.begin(),distance_pair.end(),MyDataSortPredicate);
        ^~~~~~~~~
main_test.cpp:51:2: note: in instantiation of function template specialization
      'createSortedPointDistancePairs<std::__1::__wrap_iter<Vector *> >' requested here
        createSortedPointDistancePairs( vector_contains.begin(), vector_contains.end(), query);

还有更多的文字。

MyDataSortPredicate不是具体的对象或函数。它是一个函数模板。因此,它不能作为参数传递给函数。您需要使用模板参数实例化它。

std::sort(distance_pair.begin(),distance_pair.end(),MyDataSortPredicate<SomeType>);

如果你不想显式地为比较器提供类型,你可以创建一个多孔函数对象,如std::less<void>

struct MyDataSortPredicate
{
    template <typename SetIterator> 
    bool operator(const Pair<SetIterator>& lhs, const Pair<SetIterator>& rhs)
    {
        return lhs.distance < rhs.distance;
    }
};