2016-04-19 2 views
1

я уже реализовали тестовый случай, когда я могу иметь ключ как пользовательский класс следующим образом:делегат станд :: меньше или станд :: больше в состоянии

#include <iostream> 
#include <map> 

using namespace std; 

class CoordinateValue 
{ 
public: 

    short int x_; 
    short int y_; 

    CoordinateValue(short int x = 0, short int y = 0) 
    : x_(x),y_(y) 
    { 

    } 

    bool operator<=(const CoordinateValue &right) const 
    { 
     return ((this->x_ <= right.x_) && (this->y_ <= right.y_)); 
    } 

    bool operator<(const CoordinateValue &right) const 
    { 
     return ((this->x_ < right.x_) && (this->y_ < right.y_)); 
    } 

    bool operator>=(const CoordinateValue &right) const 
    { 
     return ((this->x_ >= right.x_) && (this->y_ >= right.y_)); 
    } 

    bool operator>(const CoordinateValue &right) const 
    { 
     return ((this->x_ > right.x_) && (this->y_ > right.y_)); 
    } 


    friend ostream &operator<<(ostream &out, const CoordinateValue &val) 
    { 
     out << "[ " << val.x_ << "," << val.y_ << " ]" << std::endl; 

     return out; 
    } 
} ; 

int main() 
{ 

    std::multimap<CoordinateValue,int,std::less_equal<CoordinateValue>> intersectionIn; 


    intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(100,200),12)); 
    intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(1000,7),135)); 
    intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(0,2),112)); 
    intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(-10,-200),12)); 
    intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(-100,-200),12)); 
    intersectionIn.insert(std::pair<CoordinateValue,int>(CoordinateValue(1000,2000),12)); 

    std::multimap<CoordinateValue,int,std::greater<CoordinateValue>>::const_iterator iter = intersectionIn.begin(); 

    while(iter != intersectionIn.end()) 
    { 
     std::cout << iter->first; 
     ++iter; 
    } 

    return 0; 
} 

Теперь я хочу позвонить станд :: больше/станд :: less/std :: less_equal на основе некоторого условия. Как мне делегировать? Например, для одного условия я объявляю контейнер с std :: less и для другого условия объявляю контейнер с std :: большим.

Некоторые намеки или ссылки были бы замечательными.

Благодаря

+0

В момент времени компиляции? или время выполнения? – Jarod42

+0

Я хочу иметь его во время выполнения – sajis997

+0

Вы используете 'const_iterator' из' std :: map' с 'std :: greater' для перебора более одного с' std :: less', это предназначено? – Holt

ответ

0

Похоже, что вы хотите версию среды выполнения (от Вашего комментария), вы можете использовать тип std::function<bool(int, int)> в качестве Compare типа в multimap, а затем хранить либо std::less или std::greater при создании карты:

std::function<bool(int, int)> cmp; 
if (...) { 
    cmp = std::less<int>(); 
} 
else { 
    cmp = std::greater<int>(); 
} 
std::multimap<int, int, decltype(cmp)> map(cmp); 

Код на ideone: http://ideone.com/cP0OEm


Старый время компиляции версии ниже:

Если вы можете использовать c++11, вы могли бы использовать std::conditional:

template <typename T> 
using cmp = typename std::conditional<cond, std::greater<T>, std::less<T>>::type; 

Где cond ваше состояние, и вы можете цепи std::conditional для нескольких условий.

И потом:

std::multimap<int, int, cmp<int>> map; 

Поскольку вы не сказали, что были ваши условия, я не могу добавить больше информации.

После Вашего комментария, это может выглядеть следующим образом:

template <int value, typename T> 
using cmp = typename std::conditional<(value > 0), std::less<T>, std::greater<T>>::type; 

std::multimap<int, int, cmp<MY_VALUE, int>> map; 

Где MY_VALUE является постоянным время компиляции.

+0

Если конкретное значение больше 0, содержимое контейнера расположено в порядке возрастания, иначе оно расположено в порядке убывания при вставке в контейнер. – sajis997

+0

@ user1355185 И это конкретное значение известно во время компиляции? – Holt

+0

Я уверен, что это время исполнения. Позвольте мне сломать его больше. У меня есть конечные точки сегмента линии. Я узнаю направление сегмента линии, вычитая конечную точку из начальной точки. Если направление больше нуля, я сохраняю значения координат в порядке возрастания в порядке убывания. – sajis997

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