🗊Презентация Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1)

Нажмите для полного просмотра!
Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №1Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №2Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №3Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №4Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №5Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №6Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №7Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №8Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №9Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №10Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №11Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №12Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №13Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №14Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №15Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №16Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №17Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №18Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №19Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №20Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №21Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №22Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1), слайд №23

Содержание

Вы можете ознакомиться и скачать презентацию на тему Стандартная библиотека шаблонов в языке программирования С++. Шаблоны функций и классов. (Лекция 1). Доклад-сообщение содержит 23 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1





Стандартная библиотека шаблонов в языке программирования С++
(Standard Template Library -STL)
Описание слайда:
Стандартная библиотека шаблонов в языке программирования С++ (Standard Template Library -STL)

Слайд 2





Лекция 1

Шаблоны функций и классов
Описание слайда:
Лекция 1 Шаблоны функций и классов

Слайд 3





Шаблоны
    STL основывается на относительно новом понятии шаблона. 
Предположим, что для некоторого числа 
х > 0 нужно часто вычислять значение выражения:
	2 * х +  (х * х + 1)  /  (2 * х),
где х может быть типа double или int. Например, если х имеет тип double и равен 5.0, тогда значение выражения составляет 12.6, но если х имеет тип int и равен 5, то значение выражения будет 12.
Описание слайда:
Шаблоны STL основывается на относительно новом понятии шаблона. Предположим, что для некоторого числа х > 0 нужно часто вычислять значение выражения: 2 * х + (х * х + 1) / (2 * х), где х может быть типа double или int. Например, если х имеет тип double и равен 5.0, тогда значение выражения составляет 12.6, но если х имеет тип int и равен 5, то значение выражения будет 12.

Слайд 4





Шаблонные функции
   Вместо того чтобы писать две функции:
    double  f(double  x) 
    {   double  x2  =  2  *  х;
         return x2  +  (х  *  х  +  1)/х2;
    }       
	    и
    int f(int x)
    {   int x2 = 2 * х;
        return х2 +  (х * х + 1)/х2; 
    }
   нам достаточно создать один шаблон:
Описание слайда:
Шаблонные функции Вместо того чтобы писать две функции: double f(double x) { double x2 = 2 * х; return x2 + (х * х + 1)/х2; } и int f(int x) { int x2 = 2 * х; return х2 + (х * х + 1)/х2; } нам достаточно создать один шаблон:

Слайд 5





Шаблонные функции
   // ftempl.срр: Шаблонная функция.
#include <iostream.h>  
 template <class T>
T f (T x)
{    T x2 = 2 * x;
      return x2 + (x * x + l)/x2; 
} 
int main()
{    cout << f(5.0) << endl << f(5) << endl; 
     return 0;
}
Программа выведет: 12.6     12

В этом шаблоне Т – тип, задаваемый аргументом при вызове f.
Описание слайда:
Шаблонные функции // ftempl.срр: Шаблонная функция. #include <iostream.h>  template <class T> T f (T x) { T x2 = 2 * x; return x2 + (x * x + l)/x2; } int main() { cout << f(5.0) << endl << f(5) << endl; return 0; } Программа выведет: 12.6 12 В этом шаблоне Т – тип, задаваемый аргументом при вызове f.

Слайд 6





Шаблонные классы
   Пусть нам нужен класс Pair, чтобы хранить пары значений. Иногда оба значения принадлежат к типу double, иногда к типу int. Тогда вместо двух новых классов:
class  PairDouble  
{   public:
    PairDouble(double xl, double yl): x(xl), y(yl) {}
    void showQ(); 
    private:
    double x, y; 
};
void PairDouble::showQ() 
{ 
    cout << x/y << endl; 
}
Описание слайда:
Шаблонные классы Пусть нам нужен класс Pair, чтобы хранить пары значений. Иногда оба значения принадлежат к типу double, иногда к типу int. Тогда вместо двух новых классов: class PairDouble { public: PairDouble(double xl, double yl): x(xl), y(yl) {} void showQ(); private: double x, y; }; void PairDouble::showQ() { cout << x/y << endl; }

Слайд 7





Шаблонные классы
   После чего следует аналогичный фрагмент с классом Pairlnt для типа int. Вместо этого напишем один шаблонный класс:
// cltempl.срр:  Шаблонный класс. 
#include <iostream.h>
template <class T> 
class  Pair  
{    public:
	     Pair(T xl, T yl): x(xl), y(yl){} 
// Начальная инициализация x(xl), y(yl)
          void showQ(); 
     private:
          T x, y;
};
Описание слайда:
Шаблонные классы После чего следует аналогичный фрагмент с классом Pairlnt для типа int. Вместо этого напишем один шаблонный класс: // cltempl.срр: Шаблонный класс. #include <iostream.h> template <class T> class Pair { public: Pair(T xl, T yl): x(xl), y(yl){} // Начальная инициализация x(xl), y(yl) void showQ(); private: T x, y; };

Слайд 8





Шаблонные классы
template <class T>
void Pair<T>::showQ() 
{  
     cout << x/y << endl;
}
int main()
{  
	Pair<double> a(37.0,  5.0);
	Pair<int> u(37,  5);
	a.showQ();
	u.showQ();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
	return  0;                                                                                                                                                                                                                                                                                                                                                                                   }
Описание слайда:
Шаблонные классы template <class T> void Pair<T>::showQ() { cout << x/y << endl; } int main() { Pair<double> a(37.0, 5.0); Pair<int> u(37, 5); a.showQ(); u.showQ(); return 0; }

Слайд 9





Замечания
    Как пользователи STL мы можем не беспокоиться об определени­ях, так как шаблонные функции и классы STL доступны в виде файлов заголовков, которые можно использовать, не вдаваясь в подробности их программирования. Единственный аспект применения шаблонов, который мы уви­дим в наших программах,- это обозначение фактического типа с помощью конструкции наподобие Pair<double>.
    Процесс создания конкретной версии шаблонной функции называется инстанцированием  шаблона  или созданием экземпляра.
Описание слайда:
Замечания Как пользователи STL мы можем не беспокоиться об определени­ях, так как шаблонные функции и классы STL доступны в виде файлов заголовков, которые можно использовать, не вдаваясь в подробности их программирования. Единственный аспект применения шаблонов, который мы уви­дим в наших программах,- это обозначение фактического типа с помощью конструкции наподобие Pair<double>. Процесс создания конкретной версии шаблонной функции называется инстанцированием шаблона или созданием экземпляра.

Слайд 10





Пространства имен 
    Существует другой новый элемент языка, который мы обязаны принять во внимание. Если программа состоит из многих файлов, нужно принять меры во избежание конфликта имен. Концепция пространства имен может быть хорошим способом решения этой задачи.
// namespac.cpp: Пространства имен.
#include <iostream.h>
namespace A
{ 	int i = 10;
}
namespace B
{	int i = 20;
}
Описание слайда:
Пространства имен Существует другой новый элемент языка, который мы обязаны принять во внимание. Если программа состоит из многих файлов, нужно принять меры во избежание конфликта имен. Концепция пространства имен может быть хорошим способом решения этой задачи. // namespac.cpp: Пространства имен. #include <iostream.h> namespace A { int i = 10; } namespace B { int i = 20; }

Слайд 11





Пространства имен 
void  fA()
{    using namespace A; 
	cout << "In  fA: " <<
	A::i << " " << B::i << " " << i << endl;
}
void fB()
{    using namespace B;
	cout << "In  fB: " <<
	A::i << " " << B::i << " " << i << endl;
}  _________________________
int main()
{    fA();  fB();
cout << "In main: " << A::i << " " << B::i << endl; 
//  cout << i << endl;  Здесь это недопустимо. 
using A::i; 
cout << i << endl;  // А это разрешено.                                                                                                                                                                    
return  0; }
Описание слайда:
Пространства имен void fA() { using namespace A; cout << "In fA: " << A::i << " " << B::i << " " << i << endl; } void fB() { using namespace B; cout << "In fB: " << A::i << " " << B::i << " " << i << endl; } _________________________ int main() { fA(); fB(); cout << "In main: " << A::i << " " << B::i << endl; // cout << i << endl; Здесь это недопустимо. using A::i; cout << i << endl; // А это разрешено. return 0; }

Слайд 12





Пространства имен 
Эта программа на выходе даст:
In  fA:   10 20 10
In  fB:   10 20 20
In main:  10 20
10
Благодаря идентификаторам A и B мы впоследствии можем ссылаться на эти пространства имен. Для пространства имен A можем написать либо что-нибудь вроде:
	A:: …        либо одно из выражений:
	using namespace A;     
	using A:: i;
Ранее было:
void Pair<T>::showQ() ….
Описание слайда:
Пространства имен Эта программа на выходе даст: In fA: 10 20 10 In fB: 10 20 20 In main: 10 20 10 Благодаря идентификаторам A и B мы впоследствии можем ссылаться на эти пространства имен. Для пространства имен A можем написать либо что-нибудь вроде: A:: … либо одно из выражений: using namespace A; using A:: i; Ранее было: void Pair<T>::showQ() ….

Слайд 13





Знакомство с STL
   Рассмотрим программу, которая  читает с клавиатуры переменное количество ненулевых целых чисел и печатает их в том же порядке после того, как введен 0. 
// readwr.cpp: Чтение и вывод чисел
#include <iostream>
#include <vector>
using namespace std;
int vector_STL()
{   vector<int> v;  int x;
cout << "Enter positive integers, followed by 0:\n";
while  (cin >> x, x != 0)  v.push_back(x);
vector<int>::iterator i;
for (i=v.begin(); i != v.end();  ++i) 
cout << *i << " ";  cout << endl; return 0;  
}
Описание слайда:
Знакомство с STL Рассмотрим программу, которая читает с клавиатуры переменное количество ненулевых целых чисел и печатает их в том же порядке после того, как введен 0. // readwr.cpp: Чтение и вывод чисел #include <iostream> #include <vector> using namespace std; int vector_STL() { vector<int> v; int x; cout << "Enter positive integers, followed by 0:\n"; while (cin >> x, x != 0) v.push_back(x); vector<int>::iterator i; for (i=v.begin(); i != v.end(); ++i) cout << *i << " "; cout << endl; return 0; }

Слайд 14





Векторы и итераторы
    Шаблон vector используется как массив переменной длины. Сначала эта длина равна 0. 
vector<int> v; – описание класса  вектор v.
v.push_back(x); – добавление элемента в конец вектора.
vector<int>::iterator i; – определение итератора.
Итератор – объект, обеспечивающий доступ к  содержимому контейнера. 

Последовательные контейнеры – это вектор, список, очередь и обыкновенный массив. 
Итератор используется аналогично указателю. 
	int a[N], *р;  // &а[0] и а эквивалентны
	for (p=a; p != a+N; p++)  cout << *p << " ";
Описание слайда:
Векторы и итераторы Шаблон vector используется как массив переменной длины. Сначала эта длина равна 0. vector<int> v; – описание класса вектор v. v.push_back(x); – добавление элемента в конец вектора. vector<int>::iterator i; – определение итератора. Итератор – объект, обеспечивающий доступ к содержимому контейнера. Последовательные контейнеры – это вектор, список, очередь и обыкновенный массив. Итератор используется аналогично указателю. int a[N], *р; // &а[0] и а эквивалентны for (p=a; p != a+N; p++) cout << *p << " ";

Слайд 15





Итераторы
    for (i = v.begin(); i != v.end(); ++i)
    cout << *i << " ";
    Для этого итератора i определены также операторы ++ и -- как в префиксном, так и в суффиксном варианте. 
    В приведенном цикле лучше не заменять 
!= на <. Хотя в примере это сработает, но оператор < неприменим к некоторым другим типам, отличными от vector<int>, в то время как оператор != работает во всех случаях.
Прохождения вектора в обратном порядке:
	i = v.end();
	if (i !=v.begin()) // Проверка, что 0 был 	единственным введённым числом, 
		do cout << *--i << " "; 
		while  (i ! = v.begin());
Описание слайда:
Итераторы for (i = v.begin(); i != v.end(); ++i) cout << *i << " "; Для этого итератора i определены также операторы ++ и -- как в префиксном, так и в суффиксном варианте. В приведенном цикле лучше не заменять != на <. Хотя в примере это сработает, но оператор < неприменим к некоторым другим типам, отличными от vector<int>, в то время как оператор != работает во всех случаях. Прохождения вектора в обратном порядке: i = v.end(); if (i !=v.begin()) // Проверка, что 0 был единственным введённым числом, do cout << *--i << " "; while (i ! = v.begin());

Слайд 16





Обратные итераторы
    Существует более простой путь прохождения вектора (и других структур данных) задом наперед. Он требует использования двух других функций-членов, rbegin и rend, вместе с обратным итератором, reverse_iterator:
vector<int>::reverse_iterator i;
for (i=v.rbegin(); i != v.rend();  ++i) 
cout << *i << " ";
Заметьте, что в этом случае мы пишем ++i вместо --i.
     v.rbegin                                  v.rend
                 ↓				         ↓
                       1        2        4         5        6
	  	     ↑					     ↑
	      v.begin				   v.end
Описание слайда:
Обратные итераторы Существует более простой путь прохождения вектора (и других структур данных) задом наперед. Он требует использования двух других функций-членов, rbegin и rend, вместе с обратным итератором, reverse_iterator: vector<int>::reverse_iterator i; for (i=v.rbegin(); i != v.rend(); ++i) cout << *i << " "; Заметьте, что в этом случае мы пишем ++i вместо --i. v.rbegin v.rend ↓ ↓ 1 2 4 5 6 ↑ ↑ v.begin v.end

Слайд 17





Векторы, списки и двусторонние очереди
    В readwr.cpp 3 раза встречается слово vector.
	#include <vector>
	. . .
	vector<int> v;
	. . .
	vector<int>::iterator i;
   Применение концепции вектора обеспечивает выделение непрерывной памяти. В качестве альтернативы можно употребить связный список, как рекомендуется в книгах по структурам данных. С помощью STL мы можем использовать (двойные) связные списки, не программируя их самостоятельно. Все, что нам требуется для программы readwr.cpp,- заменить всюду слово vector на list, как показано в следующей программе:
Описание слайда:
Векторы, списки и двусторонние очереди В readwr.cpp 3 раза встречается слово vector. #include <vector> . . . vector<int> v; . . . vector<int>::iterator i; Применение концепции вектора обеспечивает выделение непрерывной памяти. В качестве альтернативы можно употребить связный список, как рекомендуется в книгах по структурам данных. С помощью STL мы можем использовать (двойные) связные списки, не программируя их самостоятельно. Все, что нам требуется для программы readwr.cpp,- заменить всюду слово vector на list, как показано в следующей программе:

Слайд 18





Использование списка
// Чтение и вывод переменного количества
// ненулевых целых (ввод завершается нулем).
#include <iostream>
#include <list>
using namespace std;
{   list<int> v;
int x;
cout << "Enter positive integers, followed by 0:\n";
while  (cin >> x, x != 0)
v.push_back(x);
list<int>::iterator i;
for (i=v.begin(); i != v.end(); ++i) 
cout << *i << " ";  cout << endl; return 0; 
}
Описание слайда:
Использование списка // Чтение и вывод переменного количества // ненулевых целых (ввод завершается нулем). #include <iostream> #include <list> using namespace std; { list<int> v; int x; cout << "Enter positive integers, followed by 0:\n"; while (cin >> x, x != 0) v.push_back(x); list<int>::iterator i; for (i=v.begin(); i != v.end(); ++i) cout << *i << " "; cout << endl; return 0; }

Слайд 19





Свойства трех последовательных контейнеров
Описание слайда:
Свойства трех последовательных контейнеров

Слайд 20





Замечания
    Программа readwr.cpp также будет правильно выполняться, если заменить слово list на deque (двусторонняя очередь), что дает нам третье решение. Пользователь не заметит никаких различии в поведении этих трех версий программы, но внутреннее представление данных будет различаться. Это скажется на наборе доступных операций, которые смогут выполняться эффективно.
Существует четвертая разновидность последовательного контейнера, обычный массив, который описывается как  Т a[N];
Описание слайда:
Замечания Программа readwr.cpp также будет правильно выполняться, если заменить слово list на deque (двусторонняя очередь), что дает нам третье решение. Пользователь не заметит никаких различии в поведении этих трех версий программы, но внутреннее представление данных будет различаться. Это скажется на наборе доступных операций, которые смогут выполняться эффективно. Существует четвертая разновидность последовательного контейнера, обычный массив, который описывается как Т a[N];

Слайд 21





Перегрузка функций
    Перегрузкой функций называется использование нескольких функций с одним и тем же именем, но с различным списком параметров. Эти функции отличаются друг от друга либо типом хотя бы одного параметра, либо количеством параметров, либо и тем и другим одновременно.
   Если алгоритм не зависит от типа данных, лучше реализовать его не в виде группы перегруженных функций, а в виде шаблона функции. В этом случае компилятор сам сгенерирует текст функции для конкретного типа данных.
Описание слайда:
Перегрузка функций Перегрузкой функций называется использование нескольких функций с одним и тем же именем, но с различным списком параметров. Эти функции отличаются друг от друга либо типом хотя бы одного параметра, либо количеством параметров, либо и тем и другим одновременно. Если алгоритм не зависит от типа данных, лучше реализовать его не в виде группы перегруженных функций, а в виде шаблона функции. В этом случае компилятор сам сгенерирует текст функции для конкретного типа данных.

Слайд 22





Краткие итоги
Шаблоны функций или шаблонные классы – это инструкции, согласно которым создаются локальные версии функций и классов для определенного набора параметров и типов данных.
Шаблоны – это мощный инструмент в С++, который намного упрощает труд программиста.
Пространства имён. Строка «using namespace std;» в начале каждой программы означает импорт всего пространства имен std. Это пространство имен содержит все имена из стандартной библиотеки языка C++.
Последовательные контейнеры – это вектор, список, очередь и обыкновенный массив.
Описание слайда:
Краткие итоги Шаблоны функций или шаблонные классы – это инструкции, согласно которым создаются локальные версии функций и классов для определенного набора параметров и типов данных. Шаблоны – это мощный инструмент в С++, который намного упрощает труд программиста. Пространства имён. Строка «using namespace std;» в начале каждой программы означает импорт всего пространства имен std. Это пространство имен содержит все имена из стандартной библиотеки языка C++. Последовательные контейнеры – это вектор, список, очередь и обыкновенный массив.

Слайд 23





Краткие итоги
Итератор – объект, обеспечивающий доступ к  	содержимому контейнера, 
	лучше не заменять   != на <.
          ----------------------
 	vector<int>::iterator i;
	for (i = v.begin(); i != v.end(); ++i)…..
6.  Обратные итераторы. 	vector<int>::reverse_iterator i;
	for (i=v.rbegin(); i != v.rend();  ++i)
Описание слайда:
Краткие итоги Итератор – объект, обеспечивающий доступ к содержимому контейнера, лучше не заменять != на <. ---------------------- vector<int>::iterator i; for (i = v.begin(); i != v.end(); ++i)….. 6. Обратные итераторы. vector<int>::reverse_iterator i; for (i=v.rbegin(); i != v.rend(); ++i)



Похожие презентации
Mypresentation.ru
Загрузить презентацию