Подскажите, происходит ли реальное дублирование ключей при вставке значений с одинаковым ключом в std::multimap?
А, простите, какая разница? Если ключи одинаковы? :)
Шутка, если непонятно...
А вообще - обратите внимание, что отображения работают с парами, и даже стандартный аллокатор описан как
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
- таки разные...
Происходящее можно грубо преставить так:
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, который просто выдает уникальное значение
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Нужно отрисовать картинку, которая должна быть любой высоты и ширины, проблема в том, что если я отрисовываю ее по такому принципу -- Ширина...