Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практика.docx
Скачиваний:
10
Добавлен:
09.06.2015
Размер:
79.45 Кб
Скачать

5. Ассоциативные контейнеры

5.1. Множества и мультимножества

Set (множество) — это ассоциативный контейнер STL, хранящий отсортированный набор уникальных объектов. Сортировка осуществляется с использованием функции сравнения Compare (по умолчанию, в качестве функции сравнения, используется std::less<Key>). [4]

Контейнеры multiset похожи на множества в том, что являются ассоциативными контейнерами, содержащими отсортированный набор объектов, но в контейнерах multiset объекты могут дублироваться. [5]

Ниже представлен код программы, которая выводит все уникальные года, содержащиеся в файле, и выводит количество повторений вводимого года с помощью функции count.

#include <set>

#include <fstream>

#include <iostream>

using namespace std;

int main()

{

ifstream in ("input.txt");

set<int> st;

multiset<int> mst;

/*Считывание данных*/

while (!in.eof()){

int x;

in>>x;

st.insert (x);

mst.insert (x);

}

in.close();

ofstream out ("output.txt");

/* уникальные года */

out<<"set:\n";

for (set<int>::iterator iter=st.begin (); iter != st.end (); ++iter){

out<<*iter<<" ";

}

out.close();

/*по заданному году вывести количество*/

int year;

cout<<"enter year: ";

cin>>year;

cout<<"count of "<<year<<": "<<mst.count(year)<<endl;

return 0;

}

Содержимое входного файла:

2000 2001 2000 2004 2005 2006 2007 2000 2009

Результат работы программы:

enter year: 2000

count of 2000: 3

5.2 Отображения и мультиотображения

Ассоциативные массивы (Maps, отображения) — это сортированные ассоциативные контейнеры которые содержат уникальные пары ключ/значение.[6]

Отображения и мультиотображения отличаются только тем, что последние могут содержать дубликаты, а первые — нет. [1]

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

#include <iostream>

#include <fstream>

#include <map>

#include <string>

using namespace std;

int main ()

{

fstream in ("input_task1.txt");

map<string,int> mp;

multimap<string,int> mmp;

/*заполнение map и multimap*/

while (!in.eof()){

string name;

in>>name;

int year;

in>>year;

mp.insert(map<string,int>::value_type(name,year));

mmp.insert(multimap<string,int>::value_type(name,year));

}

in.close();

/*вывести по заданному имени год (map)*/

string find_name_mp;

cout<<"enter name (for map) : ";

cin>>find_name_mp;

cout<<mp[find_name_mp]<<endl;

/*список годов (multimap)*/

string find_name_mmp;

cout<<"enter name (for multimap) : ";

cin>>find_name_mmp;

for (multimap<string,int>::iterator iter = mmp.find (find_name_mmp); iter != mmp.end() && iter->first == find_name_mmp ; ++iter){

cout<<iter->second <<endl;

}

return 0;

}

Содержимое входного файла:

Name1 2000

Name2 2001

Name3 2000

Name4 2004

Name2 2011

Name5 2005

Name6 2006

Name7 2007

Name2 2012

Name8 2000

Name9 2009

Результат работы программы:

enter name (for map) : Name2

2001

enter name (for multimap) : Name2

2001

2011

2012