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

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

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

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

#include

#include

#include

using namespace std;

int main()

{

ifstream in ("input.txt");

set st;

multiset 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::iterator iter=st.begin (); iter != st.end (); ++iter){

out<<*iter<<" ";

}

out.close();

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

int year;

cout<<"enter year: ";

cin>>year;

cout<<"count of "<

return 0;

}

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

2000 2001 2000 2004 2005 2006 2007 2000 2009

Итог работы программки Множества и мультимножества:

enter year: 2000

count of 2000: 3

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

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

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

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

#include

#include

#include

#include

using namespace std;

int main ()

{

fstream in ("input_task1.txt");

map mp;

multimap mmp;

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

while (!in.eof()){

string name;

in>>name;

int year;

in>>year;

mp.insert(map::value_type(name,year));

mmp.insert(multimap::value_type(name Множества и мультимножества,year));

}

in.close();

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

string find_name_mp;

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

cin>>find_name_mp;

cout<

/*перечень годов (multimap)*/

string find_name_mmp;

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

cin>>find_name_mmp;

for (multimap::iterator iter = mmp.find (find_name Множества и мультимножества_mmp); iter != mmp.end() && iter->first == find_name_mmp ; ++iter){

cout

}

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

enter name (for multimap) : Name2

Строчки

Строковые классы стандартной библиотеки C++ позволяют работать со Множества и мультимножества строчками как с обыкновенными типами, не создающими заморочек для юзеров.

Это значит, что строчки можно копировать, присваивать и ассоциировать как базисные типы, не беспокоясь о вероятной нехватке памяти либо размерах внутреннего блока, созданного для хранения знаков. Тип string представляет последовательности знаков методом, совместимым с методами и соглашениями STL. [1], [2]

Ниже представлен Множества и мультимножества код программки, демонстрирующей работу класса string и применение к нему алгоритмов STL.

#include

#include

#include

#include

using namespace std;

int main()

{

ifstream in ("input_task3.txt");

string s;

getline(in,s);

in.close();

ofstream out ("output.txt");

out<<"input file: \n"<

/*substr. Выделение подстроки меж первым Множества и мультимножества и последним пробелами*/

string::size_type left_space = s.find (" ");

string::size_type right_space = s.rfind (" ");

string s_sub = s.substr (left_space, right_space - left_space);

out<<"substr (between first space and last

space):\n"<

/*insert. Вставка подстроки в начало основной строчки*/

string s_ins = s;

s Множества и мультимножества_ins.insert (0, s_sub + " ");

out<<"insert of a substr in pos 0:\n"<

/*append. Сложение строчки и подстроки*/

string s_app = s;

s_app.append (s_sub);

out<<"append() (input string and substr)\n"<

/*copy. Копирование знаков строчки класса string в строчку типа

char* */

char buf[500];

memset (buf, '\0', 500);

s Множества и мультимножества.copy (buf, s.length(), 0);

out<<"copy() (input string to char)\n"<

/*erase. Удаение подстроки из основной строчки*/

string s_er=s;

s_er.erase(left_space, right_space - left_space);

out<<"erase substr between first space and last

space:\n"<

/*compare.Сравнивание строчки и подстроки*/

int Множества и мультимножества res=s.compare(s_sub);

out<<"compare (input string and substr):\n"<

/*swap.Меняет строчки местами*/

string first("This is first string");

string second ("This is second string");

out<<"before swap():\n"<

first.swap (second);

out<<"after swap():\n"<

/*find. Поиск первого вхожения слова 'Iterator', начиная Множества и мультимножества слева*/

string::size_type pos_find = s.find("Iterator", 0);

out<<"first 'Iterator' at "<

/*rfind. Поиск первого вхожения слова 'Iterator', начиная справа*/

string::size_type pos_rfind = s.rfind("Iterator", s.length());

out<<"\nlast 'Iterator' at "<

out.close();

return 0;

}

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

There are five kinds Множества и мультимножества of iterators: Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access Iterator.

Итог работы программки:

input file:

There are five kinds of iterators: Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access Iterator.

substr (between first space and last space):

are five kinds of iterators: Input Iterator Множества и мультимножества, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access

insert of a substr in pos 0:

are five kinds of iterators: Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access There are five kinds of iterators: Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access Iterator.

append Множества и мультимножества() (input string and substr)

There are five kinds of iterators: Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access Iterator. are five kinds of iterators: Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access

copy() (input string to char)

There are five kinds of iterators: Input Iterator Множества и мультимножества, Output Iterator, Forward Iterator, Bidirectional Iterator, and Random Access Iterator.

erase substr between first space and last space:

There Iterator.

compare (input string and substr):

before swap():

This is first string

This is second string

after swap():

This is second string

This is first string

first 'Iterator' at 41

last 'Iterator' at 128

Потоки ввода Множества и мультимножества-вывода

В C++ операции ввода-вывода производятся с помощью потоков данных. Согласно принципам объектно-ориентированного программирования, поток данных представляет собой объект, характеристики которого определяется классом. Вывод интерпретируется как запись данных в поток, а ввод — как чтение данных из потока. Для стандартных каналов ввода-вывода есть стандартные глобальные объекты Множества и мультимножества. [1]

Ниже приведён листинг программки, демонстрирующий внедрение потоков ввода-вывода.

#include

#include

#include

#include

#include

using namespace std;

/*функция, считывающая целые числа из потока ввода и копирующая их в вектор*/

void readVector(vector &v, istream &in) {

v.clear();

int a;

while (in>>a){

v.push_back (a);

}

}

/*функция, записывающая целые числа из Множества и мультимножества вектора в поток вывода*/

void printVector(vector &v, ostream &out) {

for (vector::iterator iter=v.begin(); iter != v.end(); ++iter){

out<<*iter << " ";

}

out << endl;

}

int main ()

{

vector vec;

/*наполнение вектора, в качестве аргумента передаётся cin*/

cout<<"enter vector: ";

readVector(vec, cin);

/*вывод частей вектора в поток cout*/

printVector(vec, cout);

/*наполнение Множества и мультимножества вектора, в качестве аргумента передаётся файловый

поток fin*/

ifstream fin("input_task2.txt");

readVector(vec, fin);

fin.close();

/*вывод частей вектора в файловый поток fout*/

ofstream fout("output.txt");

printVector(vec, fout);

fout.close();

/*передача строчки в строковый поток ввода*/

istringstream sstr_in("23 56 56 45 64 23 34");

readVector(vec, sstr_in Множества и мультимножества);

/*вывод частей вектора в строковый поток и вывод строчки в поток

cout*/

ostringstream sstr_out;

printVector(vec, sstr_out);

cout << "string: " << sstr_out.str();

if (true) return 0;

}

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

1990 2000 2010 2020 2030 2040 2050

Содержимое файла output.txt:

1990 2000 2010 2020 2030 2040 2050

Итог работы программки:

enter vector: 1 2 3^D

1 2 3

string: 23 56 56 45 64 23 34

Итераторы

Итераторы призваны предоставлять доступ к членам контейнеров, они могут быть применены Множества и мультимножества методом, схожим на манипуляции указателями. К примеру, можно использовать итератор для прохода по всем элементам вектора. Есть несколько различных типов итераторов:

· input_iterator (для чтения). Читают значения с движением вперед. Могут быть инкрементированы, сравнены и разыменованы.

· output_iterator (для записи). Пишут значения с движением вперед. Могут быть инкрементированы и разыменованы Множества и мультимножества.

· forward_iterator (однонаправленные). Читают либо пишут значения с движением вперед. Сочетают функциональность прошлых 2-ух типов с возможностью сохранять значение итератора.

· bidirectional_iterator (двунаправленные). Читают и пишут значения с движением вперед либо вспять. Похожи на однонаправленные, но их также можно инкрементировать и декрементировать.

· random_iterator (с произвольным доступом). Читают и пишут Множества и мультимножества значения с произвольным доступом. Самые массивные итераторы, сочетающие функциональность двунаправленных итераторов и возможность выполнения математики указателей и сравнений указателей.

· reverse_iterator (оборотные). Либо итераторы с произвольным доступом, либо двунаправленные, передвигающиеся в оборотном направлении.

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

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

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

#include

#include

#include

#include

#include

using namespace std;

int main ()

{

vector vec;

ifstream in("input_task2.txt");

while (!in.eof()){

int x;

in>>x;

vec.push_back (x);

}

in.close();

/*copy() употребляет InputIterator и OutputIterator для считывания

из потока и зпаиси в поток*/

copy (istream_iterator(cin Множества и мультимножества), istream_iterator(),

ostream_iterator (cout, " "));

ofstream out("output.txt");

out<<"vector:\n";

for (vector ::iterator iter = vec.begin (); iter != vec.end();

++iter){

out<<*iter<<" ";

}

/*max_element употребляет input iterator*/

vector::iterator max_it = max_element(vec.begin (),

vec.end());

out<<"\n\ninput iterator\nmax: "<<*max_it<<"\n\n";

/*generate_n употребляет output iterator Множества и мультимножества*/

vector vec_temp(vec);

generate_n(vec_temp.begin (), vec_temp.size(), rand);

out<<"output iterator\ngenerate rand():\n";

for (vector ::iterator iter = vec_temp.begin (); iter !=

vec_temp.end(); ++iter){

out<<*iter<<" ";

}

/*fill употребляет forward iterator*/

out<<"\n\nforward iterator:\nfill():\n";

fill (vec_temp.begin (), vec_temp.end(), 1);

for (vector ::iterator iter = vec Множества и мультимножества_temp.begin (); iter !=

vec_temp.end(); ++iter){

out<<*iter<<" ";

}

/*reverse употребляет bidirectional iterator*/

out<<"\n\nbidirectional iterator:\n"<<"reverse():\n";

vector vec_temp1(vec);

reverse (vec_temp1.begin(), vec_temp1.end());

for (vector ::iterator iter = vec_temp1.begin (); iter !=

vec_temp1.end(); ++iter){

out<<*iter<<" ";

}

/*random_shuffle употребляет random access iterator*/

out<<"\n\nrandom access Множества и мультимножества iterator:\n";

random_shuffle (vec.begin(), vec.end ());

for (vector ::iterator iter = vec.begin (); iter != vec.end();

++iter){

out<<*iter<<" ";

}

out.close();

return 0;

}

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

1990 2000 2010 2020 2030 2040 2050

Итог работы программки:

vector:

1990 2000 2010 2020 2030 2040 2050

input iterator

max: 2050

output iterator

generate rand():

41 18467 6334 26500 19169 15724 11478

forward iterator:

fill():

1 1 1 1 1 1 1

bidirectional iterator:

reverse():

2050 2040 2030 2020 2010 2000 1990

random access iterator:

2030 2010 1990 2000 2020 2040 2050


mnozhestvennoe-chislo-sushestvitelnih-v-anglijskom-yazike.html
mnozhestvennoe-dejstvie-genov.html
mnozhestvennost-i-protivorechivost-zhelanij.html