Могу ли я создать карту с помощью динамически построенного компаратора? - PullRequest
1 голос
/ 19 октября 2010

Я хочу создать std :: map в STL, но компаратор зависит от некоторого динамического значения, которое доступно только во время выполнения. Как я могу это сделать? Например, я хочу что-то похожее на std::map<int, int, Comp(value1, value2)>. value1 и value2 здесь не сравниваемые числа, это какие-то номера конфигурации.

1 Ответ

9 голосов
/ 19 октября 2010

Использовать класс функторов :

#include <map>

class Comp
{
public:
    Comp(int x, int y) : x(x), y(y) {}
    bool operator() (int a, int b) const { /* Comparison logic goes here */ }
private:
    const int x, y;
};

int main()
{
    std::map<int,float,Comp> m(Comp(value1,value2));
}

Это похоже на функцию, но в форме объекта времени выполнения. Это означает, что он может иметь состояние, которое включает конфигурацию времени выполнения. Все, что вам нужно сделать, это перегрузить operator(). Если вы определите все тела функций-членов в определении класса (как указано выше), то компилятор, вероятно, все встроит, так что производительность будет незначительной.

Если вы знаете value1 и value2 во время компиляции (т.е. если они константы времени компиляции ), вы можете использовать вместо этого шаблон функции:

template <int x, int y>
bool compare(int a, int b) { /* Comparison logic goes here */ }

int main()
{
    std::map<int,float,compare<value1,value2> > m;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...