我想对结构列表,迭代器的对结构和双值进行排序;
以上是我的尝试。我的结构是
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);
还有更多文字。
答案 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;
}
};