Класс multiset
Класс multiset - это ассоциативный контейнер из библиотеки STL, который хранит элементы в отсортированном порядке и, в отличие от set, позволяет хранить одинаковые значения. Элементы внутри контейнера всегда упорядочены по возрастанию (или по заданному компаратору). При вставке элемента контейнер автоматически находит нужную позицию, чтобы сохранить порядок сортировки. Доступ к элементам осуществляется не по индексу, а с помощью итераторов. Поиск, вставка и удаление элементов выполняются за логарифмическое время O(log n).
Синтаксис
#include <set>
std::multiset<тип> имя;
Для использования класса необходимо подключить заголовочный файл <set>. В угловых скобках указывается тип хранимых элементов. Например, multiset<int> хранит целые числа, а multiset<string> - строки.
Пример
Давайте создадим multiset с целыми числами и добавим в него несколько элементов, включая повторяющиеся:
#include <iostream>
#include <set>
using namespace std;
int main()
{
multiset<int> ms;
ms.insert(3);
ms.insert(1);
ms.insert(4);
ms.insert(1);
ms.insert(5);
ms.insert(1);
for (int elem : ms)
{
cout << elem << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 1 1 3 4 5
Как видите, элементы автоматически отсортированы по возрастанию, а дубликаты числа 1 сохранены.
Пример
Давайте посчитаем, сколько раз встречается определённый элемент, используя метод count:
#include <iostream>
#include <set>
using namespace std;
int main()
{
multiset<int> ms = {1, 2, 2, 3, 2, 4, 5};
cout << "Count of 2: " << ms.count(2) << endl;
cout << "Count of 3: " << ms.count(3) << endl;
cout << "Count of 6: " << ms.count(6) << endl;
return 0;
}
Результат выполнения кода:
"Count of 2: 3"
"Count of 3: 1"
"Count of 6: 0"
Метод count возвращает количество элементов с заданным значением. Если элемент не найден, возвращается 0.
Пример
Давайте удалим все вхождения определённого элемента с помощью метода erase:
#include <iostream>
#include <set>
using namespace std;
int main()
{
multiset<int> ms = {1, 2, 2, 3, 2, 4, 5};
ms.erase(2);
for (int elem : ms)
{
cout << elem << " ";
}
cout << endl;
return 0;
}
Результат выполнения кода:
1 3 4 5
Метод erase, вызванный со значением, удаляет все элементы, равные этому значению.