Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
77
Добавлен:
07.03.2016
Размер:
1.78 Mб
Скачать

Void main()

{

int j, num;

string str;

map_s1 m1;

map_s1::iterator i;

string st[] = {"Petya K", "Ivanova N.M.",

"Vovochka", "Vasia"};

long nom[] = {741596 , 3856745, 230546, 745697};

for(j = 0; j < 4;j++)

m1[st[j]] = nom[j]; // Занесення в словник

map_s1 m2; // Створення порожнього словника

m2.insert(map_s1::value_type("Lena", 3157725));

str = "Anna";

num = 5536590;

m2.insert(make_pair(str, num));

num = 5530000;

// Спроба вставки існуючого запису

m2.insert(make_pair(str,num));

i = m1.begin();

// Вставка в m2 першого елементу словника m1

m2.insert(*i);

m2["Lena"] = 2222222; // Корегування елементу

// Виведення словника

for (i = m2.begin(); i != m2.end(); i++)

cout << (*i).first << " " << (*i).second << endl;

}

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

Anna 5536590

Ivanova N.M. 3856745

Lena 2222222

Друга форма функції insert застосовується для прискорення процесу вставки. З цією метою їй передається першим параметром позиція словника, починаючи з якої потрібно здійснювати пошук місця вставки. Вставка виконується тільки у разі відсутності значення х в словнику. Функція повертає ітератор на елемент словника з ключем, що міститься в х. Наприклад, якщо відомо, що елементи поміщатимуться в словник в порядку зростання, можна передавати першим параметром у функцію вставки позицію попереднього елементу (в цьому випадку час вставки є константою):

#include <iostream>

#include <string>

#include <map>

using namespace std;

typedef map <string,long, less <string> > map_s1;

typedef pair <string, long > pair_sl;

Void main()

{

pair_sl p[3] = { pair_sl("Anna", 123123),

pair_sl("Maria", 234234),

pair_sl("Teresa", 345345)};

map_s1 m1;

map_s1::iterator i = m1.begin();

for (int k = 0; k<3; k++)

i = m1.insert(i, p[k]); // sic!

for (i = m1.begin(); i != m1.end(); i++)

cout << (*i).first <<" " << (*i).second << endl;

}

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

Anna 123123

Maria 234234

Teresa 345345

Третя форма функції insert використовується для вставки групи елементів, яка визначається діапазоном ітераторів. Функції видалення елементів і очищення словника аналогічні однойменним функціям інших контейнерів: перша форма функції erase видаляє елемент словника з позиції, заданої ітератором, друга – по заданому ключу, а третя видаляє діапазон елементів. Операції вставки в словник не приводять до псування пов'язаних з ними ітераторів і посилань, а операції видалення роблять недійсними тільки ітератори і посилання, пов'язані з елементами, які видаляються.

Приклад вставки, видалення, пошуку і впорядкування елементів елементів в словнику:

#include <iostream>

#include <string>

#include <map>

using namespace std;

// Предикат less

typedef map <string ,int, less<string> > mp; //1

// Предикат greater

// typedef map <string,int, greater<string> > mp; //2

typedef pair <string, int > pair_sl;

Void main()

{

mp ob;

ob["5"] = 100;

ob["4"] = 200;

ob["3"] = 300;

ob["1"] = 400;

ob["2"] = 500;

mp::iterator it;

string aa,pd = "--------------------------------\n";

for( it = ob.begin(); it != ob.end(); it++)

cout<<(*it).first <<" "<<(*it).second<<endl;

cout << pd;

it = ob.begin(); it++; // Виведення другого елементу

cout << (*it).first <<" "<< (*it).second<<endl;

cout << pd ;

int num = 888;

aa = "222";

ob.insert(make_pair(aa,num));

// Спроба вставки існуючого запису

num = 999;

ob.insert(make_pair(aa,num));it++;

cout <<(*it).first <<" "<< (*it).second << endl;

cout << pd ;

for( it = ob.begin(); it != ob.end(); it++)

cout<<(*it).first <<" "<<(*it).second<<endl;

cout << pd ;

//Пошук значення по ключу.

aa = "3";

it = ob.find(aa);

cout <<ob[aa] <<" "<<(*it).second;

cout<<endl <<pd;

it = ob.begin();

ob.insert(*it);

for( it = ob.begin(); it != ob.end(); it++)

cout<<(*it).first <<" "<<(*it).second<<endl;

cout<<pd;

pair_sl p[3] =

{

pair_sl("Anna", 123123),

pair_sl("Maria", 234234),

pair_sl("Teresa", 345345)

};

mp ob1;

it = ob1.begin();

for (int k = 0; k<3; k++)

it = ob1.insert(it, p[k]);

ob1.erase("Maria");

for( it = ob1.begin(); it != ob1.end(); it++)

cout<<(*it).first <<" "<<(*it).second<<endl;

}

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

1 400

2 500

3 300

4 200

5 100

--------------------

2 500

--------------------

222 888

--------------------

1 400

2 500

222 888

3 300

4 200

5 100

--------------------

300 300

-------------------

1 400

2 500

222 888

3 300

4 200

5 100

---------------------

Anna 123123

Teresa 345345

У даному прикладі третім параметром в шаблоні словника передається шаблон функціонального об'єкту, який називається предикатом. Докладніша інформація про предикати буде представлена в наступному розділі. У нашому випадку використовується предикат less<string>, забезпечуючий впорядковане по зростанню виведення словника за ключем типу string. У тексті програми закоментований предикат greater<string>. При його використанні дані словника виводяться в зворотному порядку. Слід звернути увагу на вставку пари з числом 999. Вона не виконана, оскільки в словнику вже є пара з ключем "222".

Розглянемо приклад роботи із словником, що включає ключ у вигляді цілих чисел і значення у вигляді структури. Тут показано формування словника, виведення його та вставку елементів.

#include <iostream>

#include <string>

#include <map>

using namespace std;

struct str

{

int a;

string dd;

};

typedef map <int ,str> mp;