Мультикарта не сортируется - PullRequest
5 голосов
/ 02 марта 2011

У меня есть эта мультикарта, созданная для отображения расстояния Хемминга строки до соответствующей ей строки.

Поскольку расстояние Хэмминга для двух струн может быть одинаковым, я хочу, чтобы они сортировались в порядке возрастания. Однако, когда я распечатываю его, он не сортируется. HamdistArray объявлен как неподписанный тип.

typedef multimap<unsigned, string, less<unsigned> > Check;
            Check pairs; 

            pairs.insert(Check::value_type(hamdistArray[j], d.sortedWordDatabase[j]));

            for(Check::const_iterator iter = pairs.begin(); iter != pairs.end(); ++iter)
            {
                cout << iter->first << '\t' << iter->second<< endl;
            }

Ответы [ 4 ]

4 голосов
/ 02 марта 2011

Элементы в мультикарте сортируются по ключу (в этом случае расстояние Хемминга без знака). Элементы с одинаковым ключом не сортируются по значению (в данном случае по строке), они обычно сохраняются в том порядке, в котором они были вставлены.

0 голосов
/ 02 марта 2011

multimap сортирует только по ключу (длине), а не по значению (строке). В этом случае я подозреваю, что ваш лучший подход - std::map<unsigned, std::set<std::string> >. Вы также можете использовать std::set<std::pair<unsigned, std::string> >, но для поиска потребуется создать фиктивные pair s для поиска.

0 голосов
/ 02 марта 2011

Это невозможно при использовании std::multimap, поскольку при сравнении ключей неизвестно, какое значение они представляют.

0 голосов
/ 02 марта 2011

Функция «меньше шаблона» не нужна, поскольку она используется по умолчанию. Попробуйте объявить чек без как:

typedef multimap<unsigned, string> Check;

Отредактировано: лучший способ сделать это - сгенерировать хеш-ключ в виде * key_type *, и тогда тип значения может быть std::pair<unsigned, string>

...