C++, multimap, дублирование ключей

188
20 октября 2018, 00:00

Подскажите, происходит ли реальное дублирование ключей при вставке значений с одинаковым ключом в std::multimap?

Answer 1

А, простите, какая разница? Если ключи одинаковы? :)
Шутка, если непонятно...

А вообще - обратите внимание, что отображения работают с парами, и даже стандартный аллокатор описан как

class Allocator = std::allocator<std::pair<const Key, T> >

Так что происходит скорее не дублирование, а хранение ключа вместе со значением.

Ключ тоже может быть составным - и тогда если использовать один ключ на все значения, можно его по сути потерять.

Ну, а вот простенькая тестовая программка:

struct Key
{
    int value, id;
};
bool operator <(const Key& a, const Key& b)
{
    return a.value < b.value;
}
int main(int argc, const char * argv[])
{
    multimap<Key,int> m;
    m.insert(make_pair(Key{1,1},11));
    m.insert(make_pair(Key{1,2},12));
    m.insert(make_pair(Key{1,3},13));
    m.insert(make_pair(Key{2,1},21));
    m.insert(make_pair(Key{2,2},22));
    m.insert(make_pair(Key{2,3},23));
    for(auto x: m)
        cout << x.first.value << ":" << x.first.id
            << "   " << x.second << endl;
}

Убедитесь, что все ключи - при их одинаковости для multimap - таки разные...

Answer 2

Происходящее можно грубо преставить так:

template < class Key, class T >
class My_multimap {
    using Tp = std::pair< Key, std::list<T> >;
    std::set<Tp> s;
    using iterator = typename set<Tp>::iterator;
    //...
public:
    // тут operator[](const Key& key) должен выдать список значений, что неудобно
    // для использования и при работе с экземплярами класса придется
    // задействовать другой обьект(для моего случая  std::list<T>)
    // поэтому определяются функции возвращения итераторов на начало и конец списка
    iterator // итератор на начало списка
    lower_bound(const Key&) const;
    iterator // итератор на место за конец списка
    upper_bound(const Key&) const;
    std::pair<iterator, iterator> // пара (начало, конец)
    equal_range(const Key&) const;
    //...
};

Таким образом ключ отображает целый список значений, а доступ к ним осуществляется итераторами на этот список, в отличии от простого map, который просто выдает уникальное значение

READ ALSO
Передача параметров сигнала в лямбду

Передача параметров сигнала в лямбду

Имеем в наличии такой коннект

191
Проблема с отрисовкой .png файла

Проблема с отрисовкой .png файла

Нужно отрисовать картинку, которая должна быть любой высоты и ширины, проблема в том, что если я отрисовываю ее по такому принципу -- Ширина...

162
Java использование Properties глобально

Java использование Properties глобально

Как правильно использовать javautil

198