使用std :: sort

时间:2016-06-12 16:03:07

标签: c++ sorting struct iterator

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

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

    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;
    }

现在我的attemt使用我的比较函数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);

还有更多文字。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

如果您不想明确地为比较器提供类型,可以创建像std::less<void>这样的多面体函数对象:

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