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

Я хотел бы написать собственный компаратор для 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 ответа

Решение

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

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

Я бы предложил использовать std::vector< std::pair<int, int> > вместо этого и просто сортировать. Оператор<;; из 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 На первом месте в вышеуказанной проблеме.

Смотрите Quick Benchmark онлайн здесь

Vector-Sort Vs Multimap-Insertion

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

Другие вопросы по тегам