Пользовательская функция сравнения для std :: multimap, когда ключи равны - PullRequest
0 голосов
/ 29 августа 2018

Я хотел бы написать собственный компаратор для std::multimap. Я хотел бы сравнить ключи , если они равны, а затем сравнить значения . Я пытаюсь сделать это, перегрузив operator() в структуре и передав объект функции в качестве третьего параметра в конструкторе std::multimap.

struct CustomComp {
    bool operator()(int key_lhs, int key_rhs){
        if (key_lhs < key_rhs) return true;
        if (key_lhs == key_rhs) //Check values;
        else return false;
    }
};

multimap<int, int, CustomComp> myMap;

Как я могу получить доступ к значениям, а не только к ключам, если оба являются int?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Что я хотел бы сделать, это сравнить ключи, если они равно , затем сравните значения .

Нет, вы не можете сделать сравнение для std::multimap по значениям .

Я бы предложил вместо этого использовать std::vector< std::pair<int, int> > и просто отсортировать. Оператор <</a> из std::pair позаботится о том, что вы хотите.

См. Здесь вывод

std::vector< std::pair<int, int> > vec{ {1,2}, {1,-1},{ 2,2 } ,{ -1,1 } };
std::sort(std::begin(vec), std::end(vec));

Обновление : Прочитав другой ответ (т. Е. std::multiset<std::tuple<int, int>>), я подумал о том, насколько плохим является std::multiset::insert.

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

См. Быстрый онлайн тест здесь

Vector-Sort Vs Multimap-Insertion

0 голосов
/ 29 августа 2018

Вы можете достичь желаемого эффекта с помощью std::multiset<std::tuple<int, int>>. Пользовательский компаратор не требуется, поскольку std::tuple использует лексикографическое сравнение (то, которое вы пытаетесь реализовать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...