Предыдущий пост -
Следующий пост -

sdt::multiset

Рубрика: Контейнеры, Дата: 28 May, 2013, Автор:
Tags: ,

std::multiset это множество с не уникальными элементами. В multiset может быть два и болье например 1 или 3 или 5.

Заголовочные файлы

#include <set>
using std::multiset;

Рассмотрим конструкторы (constructors)

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

//собственный тип для сравнения
class comp
{
public:
	bool operator()(int& a, int& b)
	{return a<b;}
};

//функция сравнения
bool fncomp(int a, int b)
{return a<b;}

int main()
{
	//создание пустого множества
	multiset<int> ms;
	//инициализация множества массивом
	int mass[5]={1,2,3,4,5};
	multiset<int> ms1(mass,mass+5);
	//вызов конструктора копирования
	multiset<int> ms2(ms1);
	//инициализация через указатели
	multiset<int> ms3(ms2.begin(),ms2.end());
	//инициализация с использованием собственного типа для сравнения
	multiset<int,comp> ms4;
	//инициализация с использованием 
	//указателя на функцию
	bool (*fn)(int,int)=fncomp;
	multiset<int,bool(*)(int,int)>ms5(fn);

	return 0;
}

multiset::operator=()

Это оператор присваивания. Присваивает значение одного multiset другому.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	multiset<int> s;
	multiset<int> s1;
	//заполняем s
	for(int i=0;i<=5;i++)
		s.insert(i);

	//смотрим размер множест
	cout <<"s.size()= "<<s.size()<<endl;//6
	cout <<"s1.size()= "<<s1.size()<<endl;//0

	//делаем присваивание
	s1=s;

	//смотрим снова размер множеств
	cout <<"s.size()= "<<s.size()<<endl;//6
	cout <<"s1.size()= "<<s1.size()<<endl;//6

	return 0;
}

Рассмотрим теперь итераторы.

multiset имеет как прямой так и реверсивный итератор. Рассмотрим пример с кодом для прямого и реверсивного итератора не константных.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создание пустого множества
	multiset<int> ms;
	//заполняем множество
	for(int i=0;i<5;i++)
		ms.insert(i);
	//создаем итератор
	multiset<int>::iterator it;

	//выводим с помощью итератора значение множества
	//0 1 2 3 4
	for(it=ms.begin();it!=ms.end();++it)
		cout <<*it<<' ';
	cout <<endl;

	//создание реверсивного итератора
	multiset<int>::reverse_iterator r_it;

	//вывод с помощью реверсивного итератора
	//4 3 2 1 0
	for(r_it=ms.rbegin();r_it!=ms.rend();++r_it)
		cout <<*r_it<<' ';
	cout <<endl;

	return 0;
}

Теперь пример с константными итераторами прямым и реверсивным.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создание пустого множества
	multiset<int> ms;
	//заполняем множество
	for(int i=0;i<5;i++)
		ms.insert(i);
	//создаем итератор
	multiset<int>::const_iterator it;

	//выводим с помощью итератора значение множества
	//0 1 2 3 4
	for(it=ms.begin();it!=ms.end();++it)
		cout <<*it<<' ';
	cout <<endl;

	//создание реверсивного итератора
	multiset<int>::const_reverse_iterator r_it;

	//вывод с помощью реверсивного итератора
	//4 3 2 1 0
	for(r_it=ms.rbegin();r_it!=ms.rend();++r_it)
		cout <<*r_it<<' ';
	cout <<endl;

	return 0;
}

Разница лишь в том, что с помощью константных итераторов нельзя модифицировать данные.

Рассмотрим емкость множества (capacity).

multiset::empty()

Функция возвращает true, если множество пустое и false, если множество не пустое.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создание пустого множества
	multiset<int> ms;
	//заполняем множество
	for(int i=0;i<5;i++)
		ms.insert(i);
	if(ms.empty()) 
		cout <<"ms is empty"<<endl;
	else
		cout <<"ms is not empty"<<endl;//ms is not empty

	return 0;
}

multiset::size()

Возвращает размер множества. Количество элементов которые есть во множестве.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создание пустого множества
	multiset<int> ms;
	//заполняем множество
	for(int i=0;i<5;i++)
		ms.insert(i);
	
	cout <<"ms.size()= "<<ms.size()<<endl;//5

	return 0;
}

multiset::size_max()

Функция возвращает максимально возможный размер множества

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создание пустого множества
	multiset<int> ms;
	
	cout <<"ms.max_size()= "<<ms.max_size()<<endl;//большое число

	return 0;
}

Рассмотрим модификаторы (modifiers)

multiset::insert()

Добавляет элемент или элементы во множество.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	multiset<int> ms;
	
	//добавляем одиночные значения
	for(int i=0;i<5;i++)
		ms.insert(i);
	//добавляем через итератор
	multiset<int>::iterator it;
	it=ms.begin();
	it=ms.insert(10);
	it=ms.insert(15);
	it=ms.insert(35);
	//добавление элементов массива
	int mass[3]={30,40,50};
	ms.insert(mass,mass+3);

	//вывод результатов
	for(it=ms.begin();it!=ms.end();++it)
		cout <<*it<<' ';
	cout <<endl;

	return 0;
}

multiset::erase()

Функция удаляет элементы с множества.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создаем пустое множество
	multiset<int> sm;
	//заполняем множество от 1 до 10
	for(int i=1;i<=10;i++)
		sm.insert(i);
	//удаляем элемент через итератор
	multiset<int>::iterator it;
	it=sm.begin();
	//удаляет первый элемент
	it=sm.erase(it);//del 1
	//удаляем второй элемент
	it=sm.erase(it);//del 2

	//удаляем по значению
	sm.erase(4);//del 4

	//удаляем список элементов
	it=sm.find(6);
	sm.erase(it,sm.end());

	//выводим то что у нас осталось
	for(it=sm.begin();it!=sm.end();++it)
		cout <<*it<<' ';
	cout <<endl;


	return 0;
}

multiset::swap()

Обменивает два множества местами.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	multiset<int> ms;
	multiset<int> ms1;
	//заполняем множество элементами
	for(int i=0;i<5;i++)
		ms.insert(i);

	//выводим размеры множества
	cout <<"ms.size()= "<<ms.size()<<endl;//5
	cout <<"ms1.size()= "<<ms1.size()<<endl;//0

	//обмениваем местами множества
	ms.swap(ms1);

	//выводим размеры после обмена
	cout <<"ms.size()= "<<ms.size()<<endl;//0
	cout <<"ms1.size()= "<<ms1.size()<<endl;//5

	return 0;
}

multiset::clear()

Функция удаляет все элементы из множества.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	multiset<int> ms;
	
	//заполняем множество элементами
	for(int i=0;i<5;i++)
		ms.insert(i);

	//выводим размеры множества
	cout <<"ms.size()= "<<ms.size()<<endl;//5
	
	//удаляем все элементы из множества
	ms.clear();

	//выводим размер после удаления элементов
	cout <<"ms.size()= "<<ms.size()<<endl;//0

	return 0;
}

multiset::emplace() и multiset::emplace_hint()

Это новые функции стандарта 2011 года, поэтому мы их рассматривать пока не будем.

Рассмотрим наблюдатели (observers)

multiset::key_comp()

функция сравнивает ключи.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	multiset<int> ms;
	//добавляем элементы
	for(int i=0;i<5;i++)
		ms.insert(i);
	//создаем тип для сравнения
	multiset<int>::key_compare comp=ms.key_comp();
	//указываем максимальный элемент множества
	int max=*ms.rbegin();
	//создаем итератор
	multiset<int>::iterator it=ms.begin();
	//выводим в цикле используя функцию сравнения ключа
	do
	{
		cout <<*it<<' ';
	}while(comp(*it++,max));
	cout <<endl;

	return 0;
}

multiset::value_comp()

Функция сравнивает значения.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создание пустого множества
	multiset<int> ms;
	//добавление элементов
	for(int i=0;i<5;i++)
		ms.insert(i);
	//создание типа для сравнения
	multiset<int>::value_compare comp=ms.value_comp();
	//создание метки для максимального элемента
	int max=*ms.rbegin();
	//создание итератора и вывод элементов в цикле
	multiset<int>::iterator it=ms.begin();
	do
	{
		cout <<*it<<' ';
	}while(comp(*it++,max));
	cout <<endl;

	return 0;
}

Операции (Operations)

multiset::find()

Функция принимает значение и возвращает указатель на значение, если оно есть во множестве.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	//создание пустого множества
	multiset<int> ms;
	//заполняем элементами
	for(int i=0;i<5;i++)
		ms.insert(i);
	//создаем итератор и присваиваем ему значение
	multiset<int>::iterator it;
	it=ms.find(3);
	cout <<"*it= "<<*it<<endl;//3
	it=ms.find(2);
	cout <<"*it= "<<*it<<endl;//2

	return 0;
}

multiset::count()

Функция принимает значение и возвращает количество элементов во множестве с таким значением, если нету элементов с данным значение, то вернется ноль.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	int mass[6]={10,4,5,10,7,10};
	multiset<int> ms(mass,mass+6);
	
	//подсчет элементов во множестве со значением 3
	cout <<"ms.count(10)= "<<ms.count(10)<<endl;//3

	return 0;
}

multiset::lower_bound() и multiset::upper_bound()

С помощью этих функций можно задать нижнюю и верхнюю границы множества.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	multiset<int> ms;
	for(int i=0;i<10;i++)
		ms.insert(i);
	//создаем итераторы
	multiset<int>::iterator it,itup,itlow;

	itup=ms.upper_bound(8);
	itlow=ms.lower_bound(3);

	//выводим результат
	for(it=itlow;it!=itup;++it)
		cout <<*it<<' ';
	cout <<endl;

	return 0;
}

multiset::equal_range()

Фукнция принимает ключи и возварщает пару итераторов на на элементы множества которые одинаковые и их можно вывести в цикле.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;
using std::pair;

int main()
{
	int mass[7]={10,3,4,5,10,3,10};
	multiset<int> ms(mass,mass+7);

	pair<multiset<int>::iterator,multiset<int>::iterator > p;

	//записываем в пару эквивалентные элементы
	p=ms.equal_range(10);

	//выводим результаты
	multiset<int>::iterator it;
	
	for(it=p.first;it!=p.second;++it)
		cout <<*it<<' ';
	cout <<endl;


	return 0;
}

Рассмотрим аллокатор (Allocator)

multiset::get_allocator()

Функция выделяет память.

#include <iostream>
using std::cout;
using std::endl;
#include <set>
using std::multiset;

int main()
{
	multiset<int> ms;
	int* p;

	p=ms.get_allocator().allocate(5);

	//инициализируем выделенную память
	for(int i=0;i<5;i++){ p[i]=i;cout <<p[i]<<' ';}
	cout <<endl;

	//освобождаем выделенную память
	ms.get_allocator().deallocate(p,5);

	return 0;
}

Все на этом мы закончим с множеством, будем разбирать std::string(), это тоже стандартный контейнер.

[youtube]http://www.youtube.com/watch?v=bfpOuw5Z_NY[/youtube]

rss