Contenedores / C++17

Multiset

Llevar al apunte ↗

Descripción

Un multiset<T> guarda elementos ordenados y permite varias copias iguales. Usalo cuando el conjunto cambia y necesitás conservar cada aparición, consultar extremos o quitar una aparición concreta de un valor.

Con las inserciones 7, 2, 7, un set guarda 2, 7 y un multiset guarda 2, 7, 7. Un map de frecuencias representa las cantidades asociadas a cada clave. El multiset mantiene cada copia como un elemento que podés señalar con un iterador.

Las operaciones por valor y por iterador tienen efectos diferentes. erase(x) quita todas las copias de x. erase(it) quita la copia señalada. Esa diferencia conviene tenerla a mano al simular altas y bajas.

Funciones y operaciones

Uso Resultado o efecto
multiset<int> s; Crea un multiset vacío
s.insert(x) Agrega una copia y devuelve su iterador
s.size() Cantidad total de elementos, incluidas las repeticiones
s.count(x) Cantidad de copias de x
s.find(x) Iterador a una copia, o end()
s.erase(x) Borra todas sus copias y devuelve cuántas quitó
s.erase(it) Borra una copia y devuelve el iterador siguiente
*s.begin() / *s.rbegin() Menor / mayor, si hay elementos
s.lower_bound(x) / s.upper_bound(x) Límites del rango de copias de x
s.empty() / s.clear() Consulta si está vacío / lo vacía

Ejemplos

Conservar copias

multiset<int> valores = {2, 2, 7};
valores.insert(2);
int copias = static_cast<int>(valores.count(2)); // 3
int total = static_cast<int>(valores.size());   // 4

Quitar una sola aparición

multiset<int> valores = {2, 2, 7};
auto it = valores.find(2);
if (it != valores.end()) valores.erase(it);
// valores queda {2, 7}

Quitar todas las apariciones

multiset<int> valores = {2, 2, 7};
int borrados = static_cast<int>(valores.erase(2)); // 2
// valores queda {7}

Consultar extremos

multiset<int> valores = {2, 2, 7};
int menor = *valores.begin();  // 2
int mayor = *valores.rbegin(); // 7

Insertar y buscar cuestan O(log n). Contar o borrar por valor puede requerir también recorrer sus k apariciones, con costo O(log n + k). Borrar invalida los iteradores de los elementos quitados.