Функция сравнения для пары

У меня есть пара: typdef pair <unsigned char *, vector<int>> pair_t

Мне нужно реализовать собственную функцию сравнения для этой карты, поэтому я попытался:

struct myCmp
{
int operator()(unsigned char arr_1[10], unsigned char arr_2[10])
{
return memcmp(arr_1, arr_2, 10);
}
};

typdef pair <unsigned char *, vector<int>, **myCmp**> pair_t;
pair_t data(someCharArr, someIntVector);

Я получаю сообщение об ошибке:

неправильный номер аргумента шаблона (3 должно быть 2)

Я сделал то же самое с map и это было хорошо.

Как создать собственную функцию сравнения для пары?

Как я могу быть уверен, что данные pair_t (someCharArr, someIntVector); найдет правильный ключ (в случае использования char * в качестве ключа)?

Благодарю.

1

Решение

Вы, кажется, смущены обязанностями разных классов. Это не std::pair что нужно беспокоиться о том, как сравнивать пары, это std::map кому нужно беспокоиться о том, как сортировать ключи.

    typedef std::map<unsigned char*, std::vector<int>, myCmp> map_t;

Исходя из того, как вы реализуете функцию сравнения, и вашего комментария о том, почему вы не можете использовать строки, я на самом деле рекомендую использовать std::array вместо unsigned char *, Ваш код выглядит так:

    typedef std::map<std::array<unsigned char, 10>, std::vector<int> > map_t;

Это работает, потому что std::array инвентарь все операторы сравнения позволяя использовать их в качестве ключей на карте.

Это происходит из-за того, что вы, кажется, знаете длину вашего массива во время компиляции, и что это всегда 10. Если вы на самом деле не знаете длину ваших массивов во время компиляции, то вы бы использовали std::vector<unsigned char> вместо std::array,

2

Другие решения

std::pair это просто структура с двумя членами, в ней нет встроенного объекта сравнения.

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

1

По вопросам рекламы [email protected]