Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

18.2.Шаблон класса tVector

Все описания надо разместить в заголовочном файле

template <class ElemType>

class TVector

{

public:

TVector();

TVector(int iSize, int iGain=0, ElemType InitValue=0);

virtual ~TVector();

bool SetCapacity(int NewCapacity);

bool SetElem(const ElemType &Value, int Index);

bool GetElem(ElemType &Value, int Index) const;

bool InsertElem(const ElemType &Value, int Index);

bool DeleteElem(int Index);

void AddElem(const ElemType &Value);

int Size() const {return VectorSize;}

int Capacity() const {return VectorCapacity;}

bool InsertVec(TVector &SubVector, int Index);

ElemType& operator [](int Index);

friend ostream & operator <<(ostream &out,const TVector<ElemType> &Vec)

{

if(!Vec.pVec) return out;

for(int i=0;i<Vec.VectorSize; i++)

{

out.width(5); out.precision(2); out.fixed;

out<<Vec.pVec[i];

}

return out;

}

protected:

ElemType * pVec;

int VectorSize, VectorCapacity, Gain;

};

template <class ElemType>

TVector<ElemType>::TVector(int iSize, int iGain, ElemType InitValue)

{

Gain=iGain;

if(iSize<=0)

{

pVec=0;

VectorCapacity=VectorSize=0;

return;

}

pVec=new ElemType [iSize];

VectorCapacity=VectorSize=iSize;

for(int i=0;i<VectorSize; pVec[i++]=InitValue);

}

// …

template <class ElemType>

bool TVector<ElemType>::InsertVec(TVector<ElemType> &SubVector, int Index)

{

if((Index<0)||(Index+SubVector.Size()>VectorSize-1))

return false;

if(VectorSize+SubVector.Size()>VectorCapacity)

SetCapacity(VectorSize+SubVector.Size());

VectorSize+=SubVector.Size();

for(int i=VectorSize-1;i>=Index; i--) pVec[i] = pVec[i-SubVector.Size()];

/*!!!*/ for(int i=Index; i<Index+SubVector.Size(); i++) pVec[i]=SubVector[i-Index];

return true;

}

// и т.д.

Использование шаблона:

void Print(TVector<double> &Vec)

{

cout<<"=========================="<<endl;

cout<<"Vec.Capacity=="<<Vec.Capacity()<<" Vec.Size=="<<Vec.Size()<<endl;

cout<<Vec;

cout<<endl<<"=========================="<<endl;

}

TVector <double> MyVec(3,5,-1.1);

int N=5,Index,i;

double Val=0.1;

try

{

for(i=0;i<N; i++)

{

MyVec.AddElem(Val);

Val+=1;

}

MyVec[-1]=0; // для проверки того, что ИС будет сгенерирована и перехвачена

}

catch(char * Mes)

{

AfxMessageBox(CString(Mes));

}

19.Стандартная библиотека, библиотеки mfc и atl

Зачем рекомендуется использовать универсальные средства стандартной библиотеки вместо разработки своих узко-специализированных и, возможно, более эффективных?

Во-первых, использование программистом стандартных контейнеров и алгоритмов в своей программе делает ее более понятной для другого программиста, вынужденного разбираться в «чужом» коде.

Во-вторых, средства стандартной библиотеки хорошо протестированы и вероятность наличия в них ошибок достаточно мала.

В-третьих, эти средства разработаны высоко профессиональными специалистами и в силу этого они достаточно эффективны.

19.1.Состав стандартной библиотеки

В соответствии со стандартом, любая полная реализация языка С++ должна включать стандартную библиотеку. Помимо такой библиотеки большинство реализаций предоставляют и другие библиотеки, в частности, библиотеки поддержки графического интерфейса пользователя (GUI –Graphical User Interface). Например, в состав среды Visual C++ входят библиотека базовых классов (MFC – Microsoft Foundation Classes) и библиотека шаблонных классов (ATL – Active Template Library).

Для многих заголовочных файлов стандартной библиотеки языка С <X.h> имеется соответствующий стандартный заголовочный файл С++ <cX>. Например, директива #include <cstdio> дает тот же результат, что и #include <stdio.h>. Этот результат становится очевидным, если посмотреть на содержимое заголовочного файла cstdio (он не имеет расширения):

// cstdio standard header

#if _MSC_VER > 1000

#pragma once

#endif

#ifndef _CSTDIO_

#define _CSTDIO_

#ifdef _STD_USING

#undef _STD_USING

#include <stdio.h>

#define _STD_USING

#else

#include <stdio.h>

#endif /* _STD_USING */

#endif /* _CSTDIO_ */

В табл. 1 перечислены заголовочные файлы стандартной библиотеки языка C++. Часть из этих файлов, а именно 13, входят в состав стандартной библиотеки шаблонов (STL – Standard Template Library). Файлы сгруппированы по категориям [4].

Таблица 1

Состав стандартной библиотеки С++

Файл

Что объявлено

Контейнеры

<vector>

одномерный массив элементов Т (STL)

<list>

двусвязный список элементов Т (STL)

<deque>

очередь элементов Т с двумя концами (STL)

<queue>

очередь элементов Т (STL)

<stack>

стек элементов Т (STL)

<map>

ассоциативный массив элементов Т (STL)

<set>

множество элементов Т (STL)

<bitset>

битовый набор (массив бит)

Основные утилиты

<utility>

пары (pair) и операции (STL)

<functional>

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

<memory>

распределители памяти для контейнеров (STL)

<ctime>

конвертирование времени и даты между различными форматами

Итераторы

<iterator>

итераторы и их поддержка (STL)

Алгоритмы

<algorithm>

основные алгоритмы (STL)

<cstdlib>

функции bsearch() и qsort()

Диагностика

<stdexcept>

объявления классов стандартных исключительных ситуаций

<cassert>

макросы утверждений

<cerrno>

обработка ошибок в стиле языка С

Строки

<string>

строка элементов Т

<cctype>

классификация символов

<cwtype>

классификация символов из расширенного набора

<cstring>

функции над строками в стиле С

<cwchar>

функции над строками символов из расширенного набора в стиле С

<cstdlib>

функции над строками в стиле С

Ввод/вывод

<iosfwd>

предварительные объявления средств ввода/вывода

<iostream>

стандартные объекты и операции с потоками ввода/вывода

<ios>

базовые классы потоков ввода/вывода

<streambuf>

буферизация потоков

<istream>

шаблон потока ввода

<ostream>

шаблон потока вывода

<iomanip>

манипуляторы для управления состоянием потока

<sstream>

потоки в строки/из строк

<cstdlib>

функции для работы с символами

<fstream>

потоки ввода/вывода в файлы

<cstdio>

семейство функций ввода/вывода printf()

<cwchar>

ввод/вывод символов из расширенного набора в стиле printf()

Локализация

<locale>

локализует различия в человеческих языках и культурах

<clocale>

локализует различия в человеческих языках и культурах в стиле С

Поддержка языка (программирования)

<limits>

числовые ограничения

<climits>

макросы пределов скалярных чисел в стиле С

<cfloat>

макросы пределов чисел с плавающей точкой в стиле С

<new>

динамическое распределение памяти

<typeinfo>

поддержка идентификации типов во время выполнения

<exception>

поддержка обработки исключительных ситуаций

<cstddef>

языковая поддержка библиотеки С

<cstdarg>

поддержка функций с переменным числом аргументов

<csetjmp>

раскрутка стека в стиле С (для поддержки нелокальных передач управления)

<cstdlib>

завершение программ

<ctime>

системные часы

<csignal>

для обработки исключительных ситуаций в стиле С

Числа

<complex>

комплексные числа и операции над ними

<valarray>

векторы чисел и операции над ними

<numeric>

шаблоны функций, реализующих распространенные числовые операции (STL)

<cmath>

общие математические функции

<cstdlib>

случайные числа в стиле С

В качестве основного литературного источника по стандартной библиотеке я бы рекомендовал работу [4], а, в частности, по библиотеке стандартных шаблонов работу [5], одного из авторов которой – Степанова – считают чуть не единственным разработчиком этой библиотеки. Работа [6] также содержит описание, с примерами, библиотеки шаблонов и алгоритмов.

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