2015-12-09 5 views
1

У меня есть пара: 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); 

messge ошибки я получаю wrong number of template argument (3 should be 2)

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

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

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

спасибо.

+2

Почему бы не использовать 'std :: sting' вместо' char * '. Если вы используете 'std :: string', должен работать встроенный оператор сравнения. – NathanOliver

+0

'std :: pair' не принимает оператор сравнения. Они уже определены в терминах компонентов пары. –

+0

Я не могу использовать строку, потому что все данные, которые я получаю, это char *, и я не могу быть уверен, что char * не будет содержать никаких «0», которые прервут сравнение строк - если я преобразую char * в string – user1673206

ответ

1

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

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

+0

, так как я могу быть уверен, что данные 'pair_t (someCharArr, someIntVector);' найдут правильный ключ? – user1673206

2

Вы, кажется, путаетесь с обязанностями разных классов. Это не 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 реализует all the comparison operators что позволяет использовать их в качестве ключей в карте.

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

 Смежные вопросы

  • Нет связанных вопросов^_^