- •Содержание
- •1. Пары
- •2. Контейнеры stl
- •3. Алгоритмы stl
- •4. Адаптеры контейнеров
- •5. Ассоциативные контейнеры
- •5.1. Множества и мультимножества
- •5.2 Отображения и мультиотображения
- •6. Строки
- •7. Потоки ввода-вывода
- •8. Итераторы
- •9. Управление памятью. Класс auto_ptr
- •Список использованных источников
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