Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KPIYaP_OTVET_3.rtf
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
540.37 Кб
Скачать

Int count;

public:

counter(int n)

{

reset(n);

}

Void reset(int n)

{

if(n<=up) count = n;

else count = up;

}

int run()

{

if(count>lo) return count--;

return lo;

}

};

}

Int main()

{

counter_namespace::up=100;

counter_namespace::lo=0;

counter_namespace::counter c(10);

int i;

do

{

i=c.run();

cout<<i<<" ";

}

while(i>counter_namespace::lo);

cout<<endl;

c.reset(100);

counter_namespace::lo=90;

do

{

i=c.run();

cout<<i<<" ";

}

while(i>counter_namespace::lo);

return 0;

}

3.22

Пространства имен могут быть вложенными.

namespace n1{

...

namespace n2{

// ...

}

...

}

n1::n2::item = 2

Пространства имен могут не иметь имени.

Неименованные или безымянные пространства имён - особая разновидность пространства имён, которая позволяет создавать уникальные идентификаторы, область видимости которых ограничена файлом.

namespace{

// ...

}

Область видимости идентификаторов из неименованного пространства имён ограничена файлом, в котором это пространство объявлено.

Особенности:

  • Внутри файла доступ к таким идентификаторам производится без использования квалификаторов;

  • Вне файла такие переменные невидимы;

  • Неименованные пространства имён позволяют избежать применения спецификатора static, который также сужает область видимости глобального имени до размеров файла.

#include <iostream>

using namespace std;

namespace

{

int j;

}

Int main()

{

j=2;

cout << j;

return 0;

}

3.23

Директива using namespace.

using namespaсe n1;

Особенности:

  • Применяется для добавления всех элементов некоторого пространства имён к текущему глобальному пространству имён

  • n1 - название пространства имён

  • доступ ко всем добавленным элементам может проводится без использования квалификатора

  • не рекомендуется для использования в глобальном пространстве имен заголовочных файлов

Объявление using::n1::member.

Особенности:

  • Применяется для добавления одного элемента некоторого пространства имён к текущему глобальному пространству имён

  • n1 - название пространства имён

  • member-конкретный элемент пространства имён

  • доступ ко всем добавленным элементам может проводится без использования квалификатора

3.24

Глобальное пространство имен

Соответствует области объявлений на уровне файла.

Стандартное пространство имен std::

Содержит все функции, данные и классы стандартной библиотеки C++.

/* пичалька :( */

3.25

Оператор asm

Для програмирования особых ситуаций есть возможность вставки в программы кода на языке Assembler

asm("инструкция");

asm инструкция;

asm { список инструкций }

Особенности:

  • список допустимых инструкций зависит от компилятора

#include <iostream>

using namespace std;

Int main(){

int a = 10, b = 20, c = 0;

asm{

mov eax, a

mov edx, b

add eax, edx

mov c, eax

}

cout << c;

return 0;

}

3.26

Стандартная библиотека шаблонов (STL)

STL содержит универсальные шаблонные классы и функции, реализующие большое количество широко распространенных алгоритмов и структур данных.

Особенности:

  • одна из мощных составных частей С++

  • можно применять к различным типам данных

Состав STL:

  • контейнеры

  • алгоритмы

  • итераторы и доп.компоненты

  • распределители

  • предикаты

  • функции сравнения

  • функторы ( объекты-функции )

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

3.27

Контейнер-объект, хранящий внутри себя другие объекты.

Виды контейнеров:

  • Последовательные-хранящие линейные списки объектов

  • Ассоциативные-доступ к хранимым объектам выполняется с использованием ключа

  • Адаптеры - не предоставляют реализации структуры, а преобразуют одну структуру в другую, не поддерживают работу с итераторами

Контейнерные классы

  • <bitset>:bitset-набор битов

  • <deque>:deque-двунаправленная очередь

  • <list>:list-двунаправленный линейный список

  • <map>:map-набор пар ключ-значение(уникальный ключ)

  • multimap-набор пар ключ-значение(ключ может дублироваться);

  • <set>:set-множество уникальных ключей

  • multiset-множество(ключ может дублироваться);

  • <stack>:stack-стек

  • <queue>:queue-очередь

  • priority_queue-очередь с приоритетами

  • <vector>:vector-динамический массив

Принципы работы с контейнером

  • Cначала необходимо выбрать тип контейнера, который отвечает требованиям к описанию объекта(массив, список, ассоциативный массив и т.п.)

  • В зависимости от типа выбранного контейнера получаем доступ к функциям-членам добавления и удаления

  • Доступ к элементам контейнера обеспечивают итераторы, которые можно получить специальными функциями

  • Для работы с элементами контейнера также используются алгоритмы и специальные функции-члены.

Контейнерные последовательности.

  • vector

  • deque

  • list

Вектор(класс vector)

Класс vector-динамический массив, размеры которого могут изменяться при добавлении и удалении его элементов

Особенности:

1) Размер массива не фиксирован

2) Для доступа к элементам вектора может использоваться обычный способ индексации

3) Более мощное и гибкое описание, по сравнению со стандартными массивами, но менее эффективное по производительности

4) Для достижения гибкости и машинно-независимости объект, помещаемый в вектор, должен иметь конструктор по умолчанию и перегруженные операторы сравнения.

Создание вектора

Шаблонная спецификация вектора:

template<class T, class Allocator=allocator<T>>

class vector

Конструкторы:

  • Создание пустого вектора explicit vector(const Allocator &a=Allocator());

  • Создание вектора, состоящего из num элементов, имеющих значений val, которое можно задать по умолчанию:

explicit vector(size_type num, const T &val=T(), const Allocator &a=Allocator());

  • Создание вектора, содержащего элементы вектора ob:

vector(conts vector<t, Allocator> &ob);

  • Создание вектора, состоящего их элементов, лежащих в диапазоне, определенном итераторами start и end:

template<class InputIterator>

vector(inputIterator start, inputIterator end, const Allocator &a = Allocator());

#include <iostream>

#include <vector>

using namespace std;

class tempdata

{

double t;

int n;

public:

tempdata(int nn=-1,double tt=0)

{

n=nn;t=tt;

}

tempdata &operator =(double x)

{

t=x; return this;

}

double gett() {return t;}

};

int main()

{

vector<template> v;

for(int i=0;i<8;i++)

v.push_back(tempdata(i,60.0+rand()%30));

cout<<"temperature f: ";

for(int i=0;i<v.size;i++)

cout<<v[i].gett()<<" " ;

cout<<endl;

for(int i=0;i<v.size();i++)

v[i]=(v[i].gett()-32.0)*5.0/9.0;

cout<<"temperature c:";

cout.precision(2);

for(int i=0;i<v.size();i++)

cout<<v[i].gett()<<" ";

cout<<endl;

return 0;

}

Список(класс list)

Класс list - двунаправленный линейный список, размеры которого могут изменяться при добавлении и удалении его элементов.

Особенности:

  • Размер списка не фиксирован

  • Доступ к элементам списка может быть лишь последовательным

  • Можно перемещаться от начала к концу и от конца к началу списка

  • Для достижения гибкости и машинно-независимости, объект, помещаемый в список, должен иметь конструктор по умолчанию и перегруженные операторы сравнения.

Создание списка

Шаблонная спецификация списка:

template<class T, class Allocator=allocator<T>>

class list

Конструкторы:

  • Создание пустого списка explicit list(const Allocator &a=Allocator());

  • Создание списка, состоящего из num элементов, имеющих значений val, которое можно задать по умолчанию:

explicit list(size_type num, const T &val=T(), const Allocator &a=Allocator());

  • Создание списка, содержащего элементы вектора ob:

list(conts list<t,Allocator> &ob);

  • Создание списка, состоящего их элементов, лежащих в диапазоне, определенном итераторами start и end:

template<class InputIterator> list(inputIterator start, inputIterator end, const Allocator &a=Allocator());

#include <iostream>

#include < list >

using namespace std;

template <class t>

void show_list( list<t> &l, const char *name)

{

list<t>::iterator l_iter;

cout<<name<<" = ";

for(l_iter=l.begin();l_iter!=l.end(); l_iter++)

{

cout<<" "<<*l_iter;

}

cout<<endl;

}

int main()

{

//empty list

list<int> l0;

show_list (l0, "l0");

//3 elements, default value 0

list<int> l1(3);

show_list (l1, "l1");

//5 elements, value 2

list<int> l2(5,2);

show_list (l2, "l2");

//3 elements of value 1 and allocator of vector v2

list<int> l3(3,1,l2.get_allocator());

show_list (l3, "l3");

//copy of vector v2

list<int> l4(l2);

show_list(l4, "l4");

//vector by coping the range v4(1,3)

list<int> ::iterator li1=l4.begin(); li1++;

list<int> ::iterator li2=li1; li2++;li2++;

list<int> l5(li1,li2);

show_list(l5, "l5");

return 0;

}

Методы класса list

  • Получить итератор, установленный на первый элемент списка: iterator begin(); const_iterator begin() const;

  • Получить итератор, установленный на элемент, следующий за последним элементом списка: iterator end(); const_iterator end() const;

  • Получить ссылку на первый элемент списка: reference front(); const_reference front() const;

  • Получить ссылку на последний элемент списка: reference back(); const_reference back() const;

  • Удалить все элементы списка: void clear();

  • Выполнить проверку на наличие элементов вектора(true если вектор пуст): bool empty() const;

  • Получить текущее количество элементов списка: size_type size() const;

  • Добавить элемент val в конце списка: void push_back (const T &val);

  • Вставить элемент val перед элементом, на который указывает итератор I; возвращает итератор на вставленный элемент val: iterator insert(iterator I,const T &val);

  • Вставить num копий элемента val перед элементом, на который указывает итератор i:

void insert(iterator I, size_type num, const T &val);

  • Вставить последовательность элементов, заданную итераторами start и end перед элементом, на который указывает итератор i: template<class InputIterator> void insert(iterator I, InputIterator start, InputIterator end);

  • Удалить последний элемент списка: void pop_back();

  • Удалить первый элемент списка: void pop_front();

  • Удалить элемент, на который указывает итератор i; возвращает итератор на элемент, следующий за удалённым элементом: iterator erase(iterator i);

  • Удалить элементы диапазона, заданную итераторами start и end на элемент, следующий за последним удалённым элементом: iterator erase(iterator start, iterator end)

  • Удалить элементы списка, значение которых равно val: void remove(const T &val);

  • Изменить порядок следования элементов списка на противоположный: void reverse();

  • Упорядочить список(fcmp-метод сравнения элементов для упорядочивания): void sort();

template< class Cmp>

void sort(Cmp fcmp);

  • Переместить элементы из упорядоченного списка ob в текущий список с упорядочиванием(fcmp-метод сравнения элементов для упорядочивания)

void merge(list <t,Allocator> &ob);

template <class Cmp>

void merge(list<T, Allocator> &ob, Cmp fcmp);

  • Переместить все элементы из списка ob в текущий список с позиции, указанной итератором i:

void splice(iterator I, list<T, Allocator> &ob);

  • Переместить элемент из списка ob с позиции на которую ссылается итератор e1 в текущий список в позицию, указанную итератором i:

void splice(iterator I, list<T, Allocator> &ob, iterator el);

  • Переместить элемент , расположенные в диапазоне, заданном итераторами start и end из списка ob в текущий список в позицию, указаную итератором i:

void splice(iterator I, list<T, Allocator> &ob, iterator start, iterator end);

#include <iostream>

#include <list>

#include <conio.h>

using namespace std;

template <class T>

void show( list<T> &l)

{

list<T>::iterator li;

cout<<" size ="<<l.size()<<";";

cout<<"list =";

for(li=l.begin();li!=l.end(); li++)

{

cout<<*li;

}

cout<<endl;

}

int main()

{

list<char> l;

cout<<"\n insert values to list\n";

{

show(l);

for(int i=0;i<5;i++)

l.push_back(rand() %10+'a');

show(l);

}

cout<<"\n insert values to list\n";

{

show(l);

for(int i=0;i<5;i++)

l.push_front(rand() %10+'a');

show(l);

}

cout<<"\nsort list\n";

{

show(l);

l.sort();

show(l);

}

cout<<"\n merge list\n";

{

list<char> l1;

for(int i=0;i<5;i++)

l1.push_back(i+'a');

show(l1);

show(l);

l.merge(l1);

show(l);

show(l1);

}

cout<<"\nremove 'b'\n";

{

show(l);

l.remove('b');

show(l);

}

cout<<"\nreverse list\n";

{

show(l);

l.reverse();

show(l);

}

cout<<"\nsplice list\n";

{

list<char> l1;

for(int i=0;i<5;i++)

l1.push_back(rand()%10+'a');

show(l1);

show(l);

list<char>::iterator li=++l.begin();

list<char>::iterator li1s=l1.begin();

list<char>::iterator li1e=++(++l1.begin());

l.splice(li,l1,li1s,li1e);

show(l);

show(l1);

}

fflush(stdin);

getch();

return 0;

}

/* Класс <deque> по аналогии + читать методу Лу */

3.28

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

  • set

  • multiset

  • map

  • multimap

Особенности:

  • Классы set и multiset манипулируют множеством значений, одновременно являющихся клюючами.

  • Классы map и multimap манипулируют множеством значений, ассоциируемых с ключами.

Класс map

Ассоциативный массив, в котором хранятся пары ключ-значение, причем каждому ключу соответсвует одно единственное значение.

Особенности:

  • размер не фиксирован

  • не допускает дубликаты ключей

  • доступ к значению элементов массива может происходить по значению ключа

  • объект, явл. ключом, должен определять конструктор по умолчанию и операторы сравнения для хранения упорядоченного списка ключей

Созданий ассоциативного массива.

template < class Key, class T, class Cmp = less<Key>, class Allocator = allocator< pair < const Key, T > > >

class map;

Конструкторы:

  • создание пустого асс. массива, функция fcmp определяет поядок следования элементов массива:

explicit map ( const Cmp &fcmp = Cmp, const Allocator &a = Allocator() );

  • создание асс. массива, содержащего эл-ты массива ob

map ( const map< Key, T, Cmp, Allocator> & ob);

  • создание массива, состоящего из элементов, лежащих между итераторами start и end :

template < class InputIterator>

map ( InputIterator start, InputIterator end, const Cmp &fcmp = Cmp(), const Allocator &a = Allocator() );

Методы класса map:

  • (constructor) Construct map (public member function)

  • (destructor) Map destructor (public member function)

  • operator= Copy container content (public member function)

Iterators:

  • begin Return iterator to beginning (public member function)

  • end Return iterator to end (public member function)

  • rbegin Return reverse iterator to reverse beginning (public member function)

  • rend Return reverse iterator to reverse end (public member function)

Capacity:

  • empty Test whether container is empty (public member function)

  • size Return container size (public member function)

  • max_size Return maximum size (public member function)

Element access:

  • operator[] Access element (public member function )

  • Modifiers:

  • insert Insert element (public member function )

  • erase Erase elements (public member function)

  • swap Swap content (public member function)

  • clear Clear content (public member function)

Observers:

  • key_comp Return key comparison object (public member function)

  • value_comp Return value comparison object (public member function)

Operations:

  • find Get iterator to element (public member function )

  • count Count elements with a specific key (public member function)

  • lower_bound Return iterator to lower bound (public member function)

  • upper_bound Return iterator to upper bound (public member function)

  • equal_range Get range of equal elements (public member function)

Allocator:

  • get_allocator Get allocator (public member function )

Пара ключ-значение pair

  • можно создать путем вызова конструктора pair

  • путем использования специальной функции make_pair:

template < class KType, class VType>

pair < KType, VType > make_pair (const KType &k, const VType &v);

#include <iostream>

#include <map>

using namespace std;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]