У меня есть пара: 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 * в качестве ключа)?
Благодарю.
Вы, кажется, смущены обязанностями разных классов. Это не 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
,
std::pair
это просто структура с двумя членами, в ней нет встроенного объекта сравнения.
Вы можете быть смущены для объекта сравнения, указанного для std::map
(который, в свою очередь, содержит последовательность std :: pair).