Это хорошая идея, чтобы индексировать карту STL с парой? - PullRequest
2 голосов
/ 23 апреля 2010

Мне просто интересно, стоит ли создавать такую ​​структуру данных, как

std::map< std::pair<int,int>,std::string >

Просто интересно, как пары будут упорядочены внутри ...: S

Спасибо!

Ответы [ 3 ]

9 голосов
/ 23 апреля 2010

Пары будут упорядочены с использованием пары operator< (операция сравнения по умолчанию для std::map), которая

Возвращает: x.first < y.first || (!(y.first < x.first) && x.second < y.second)

(C ++ 03, 20.2.2 / 6)

Обратите внимание, что использование пары в качестве ключа карты может привести к путанице, особенно при работе с итераторами карты (it->first.first для получения первого элемента пары ключей).выглядит просто смешно).Но в некоторых случаях это может быть проще, чем создавать новую структуру для ключа.

Как и во всех вещах, используйте с осторожностью, и если это не так просто и легко понять, вероятно, лучше найти другой способ сделать это.

1 голос
/ 23 апреля 2010

Если вы хотите иметь два индекса для вашей хеш-таблицы, вам следует взглянуть на Boost :: multiindex контейнеры.

Что касается ответа на ваш вопрос, почему бы и нет, если вы можете справиться с ограничениями, на которые указывали другие. Я всегда за любое решение, которое является ясным, простым в использовании и соответствует целям рассматриваемой проблемы.

1 голос
/ 23 апреля 2010

Можно.По моему мнению, хотя вы должны сделать что-то более выразительное, чем это, потому что std::pair не предназначен для этого.Например, если вы хотите сохранить строки на карте по их хешу, вы можете сделать что-то вроде:

struct Hash {
    int hash_low;
    int hash_high;

    bool operator<(const Hash& other) const;
};

И затем использовать map<Hash,string> вместо map<pair<int,int>,string>.

...