2016-03-26 3 views
2

Я хочу создать boost::binomial_heap с компаратора, который использует внешние данные, что-то вродекомпаратор с захватом

bool compare(int a1, int a2) 
{ 
    return price[a1] < price[a2]; 
} 

(здесь price, например, является vector двойников.)

Как объявить функция сравнения, которая захватывает price?

+0

Что такое 'цена'? –

+0

Например, вектор удвоений, индексируемый по int, определенный в том же классе, в котором используется куча. – danatel

ответ

0

Следующая C++ 11 кода показано, как это сделать так:

#include <vector> 
#include <map> 
int main() 
{ 
    std::vector<double> price{0.3, 0.2, 0.1}; 
    auto cmp = [&price](int i, int j){return price[i] < price[j];}; 
    std::map<int, float, decltype(cmp)> m(cmp); 
    m[2] = 'b'; 
    m[1] = 'c'; 
} 

Линия

std::vector<double> price{0.3, 0.2, 0.1}; 

определяет вектор price.

Линия

auto cmp = [&price](int i, int j){return price[i] < price[j];}; 

создает функцию лямбда, которая захватывает price по ссылке.

Линия

std::map<int, float, decltype(cmp)> m(cmp); 

создает контейнер (в данном случае std::map) спараметрированного этого типа, а также принимает объект в качестве компаратора. Использование этого с другим контейнером будет аналогичным.

+0

Спасибо. Что делать, если я хотел создать класс, который содержит как карту «m», так и вектор «цена» в качестве членов? Можно ли объявить функцию 'cmp', которая фиксирует это значение, а затем использовать ее тип в объявлении переменной-члена 'm'? – danatel

+0

@ danatel Да, это способ сделать это. –

Смежные вопросы