2016-06-20 3 views
1

У меня есть вектор следующего типа:C++ сортировка с обычаем функции сравнения

std::vector< std::pair< std::pair< int, int >, std::vector<float> > > neighbors; 

Я хотел бы создать своего рода следующий вектор следующим

std::sort(neighbors.begin(), neighbors.end(), myFunc(index)); 

где,

bool myFunc(const std::pair< std::pair< int, int >, float > &a, const std::pair< std::pair< int, int >, float > &b, const int index){ 
    return (a.second[index] > b.second[index]); 
} 

Я знаю, что синтаксис неверен, но я хочу предоставить индекс для сравнения только этого элемента вектора.

Я не уверен, как передать этот аргумент myFunc.

+0

Сторона Примечание: вы можете заменить std :: pair более описательной версией –

+0

«Сравнивая только этот элемент» ... с чем? вам нужны два элемента для сравнения. – Octopus

ответ

0

Лямбда:

std::sort(
    neighbors.begin(), 
    neighbors.end(), 
    [index](const std::pair< std::pair< int, int >, std::vector<float> > &a, 
      const std::pair< std::pair< int, int >, std::vector<float> > &b) 
      { 
       return (a.second[index] > b.second[index]); 
      } 
); 

См What is a lambda expression in C++11? для введения Детальные.

+1

Незначительный nitpick: 'std :: vector ', а не 'float' для второго элемента внешней' std :: pair' –

+0

@MarcoA. Благодарю. (Хм, я был уверен, что я скопировал эту часть ...) – deviantfan

0

Pre-C++ 11 Решение: использовать экземпляр объекта в качестве пользовательского компаратора

решение
struct Comparator { 
    Comparator(int index) : index_(index) {} 
    bool operator() (const std::pair< std::pair< int, int >, std::vector<float> > &a, 
         const std::pair< std::pair< int, int >, std::vector<float> > &b) 
    { 
     return (a.second[index_] > b.second[index_]); 
    } 

    int index_; 
}; 

sort(neighbors.begin(), neighbors.end(), Comparator(42)); 

C++ 11 +: использовать лямбда

std::sort(neighbors.begin(), neighbors.end(), [index] 
         (const std::pair< std::pair< int, int >, std::vector<float> > &a, 
          const std::pair< std::pair< int, int >, std::vector<float> > &b) 
    { 
    return (a.second[index] > b.second[index]); 
    } 
); 

Мой совет: идти на lambda, если вам разрешено использовать возможности C++ 11. Это, наверное, более элегантный и читаемый.