шпоры3 (1079650)
Текст из файла
10. Статические поля данных и методы классов
Ключевое слово static можно применять к членам класса. Объявляя член класса статическим, мы тем самым уведомляем компилятор о том, что независимо от того, сколько объектов этого класса будет создано, существует только одна копия этого static члена. Один статический член класса разделяется всеми объектами класса. Все статические данные при первом создании объекта инициализируются нулевыми значениями, если не представлено других значений инициализации.
Необходимо обеспечить глобальное определение члена данных класса вне этого класса. Это реализуется путем повторного объявления этой статической переменной с помощью оператора разрешения области видимости “::” , который позволяет идентифицировать, к какому классу она принадлежит. Только в этом случае для этой статической переменной будет выделена память.
class ShareVar
{static int num;
public:
void setnum();};
int ShareVar::num; определение статического члена
Если static переменная является открытой public переменной, к ней можно обращаться напрямую через имя ее класса, без ссылки на какой-либо конкретный объект.
class ShareVar
{ public:
static int num;
void setnum();};
Обращаемся к статической переменной напрямую
ShareVar::num=100;
Можно также объявить статическим и метод класса. К статической функции, члену класса, могут получить доступ только другие static члены этого класса. Статические методы классов не имеют указателя this. Также их нельзя объявлять с модификаторами const и volatile. Статический метод класса можно вызвать для объекта ее класса или независимо от какого бы то ни было объекта, а для обращения к ней достаточно использовать имя класса и оператор разрешения области видимости “::”.
-
Способы хранения разреженных матриц
Все способы хранения разреженных матриц заключаются в том, чтобы хранить только ненулевые элементы матрицы или, может быть, небольшое количество нулей вместе с ними.
Разреженный строчный формат(РСФ).
Это наиболее широко используемая форма хранения разреженных матриц.
Пусть есть прямоугольная n*m матрица А. Для ее представления в РСФ нужно три одномерных массива.
1)AN массив ненулевых элементов матрицы А.
2)JA массив соответствующих столбцовых индексов ненулевых элементов матрицы А.
3) IA массив указателей- целочисленный массив, i-я компонента которого указывает, с какой позиции массивов AN и JA начинается описание i-й строки матрицы А. Здесь предусмотрена дополнительная компонента, которая является последней и указывает номер первой свободной позиции в массивах AN и JA. Таким образом, описание i-й строки матрицы А хранится в позициях IA(i) и [IA(i+1)-1] массивов AN и JA за исключением равенства IA(i+1)= IA(i), означающего, что i-я строка пуста. Следовательно элементы записываются в массив по порядку следования строк. Если А имеет m строк, то массив IA содержит (m +1) позицию.
Данный способ представления называется полным, так как представлена вся матрица А.
Разреженный столбцовый формат(РСтФ).
Здесь элементы хранятся не по строчкам, как в РСФ, а по столбцам. Столбцовые представления могут также рассматриваться и как строчные представления транспонированных матриц. Таким образом, в массиве JAT указывается строчный индекс соответствующего элемента, а элементы IAT указывают, с какой позиции начинается описание очередного столбца матрицы А.
Строчный разреженный формат хранения симметричных матриц.
Для симметричной матрицы достаточно хранить лишь ее диагональ и верхний(нижний) треугольник. При этом можно указать два способа ее хранения.
1)строчное представление диагонали и верхнего(нижнего) треугольника.
2)выделение диагональных элементов матрицы А в отдельный массив, а разреженным форматом представляется только верхний(нижний) треугольник матрицы А.
-
Встроенные методы классов
Встраиваемая функция-это небольшая по объему кода функция, код которой подставляется вместо ее вызова.
Существует два способа создания встраиваемой (встроенной) функции. Первый способ состоит в использовании модификатора inline.
Причиной существования встраиваемых функций является их эффективность. При каждом вызове обычной функции должна быть выполнена целая последовательность инструкций, связанных с обработкой самого вызова, включающего помещение ее аргументов в стек, и с возвратом из функции. В некоторых случаях значительное количество циклов центрального процессора используется именно для выполнения этих действий. Но если функция встраивается в строку программы, подобные системные затраты попросту отсутствуют, и общая скорость выполнения программы возрастает.
Продемонстрируем использование встраиваемой функции.
#include <iostream>
Using namespace std;
class cl
{int i;
public:
int get_i();
void put_i(int j);};
inline int cl::get_i()
{return i;}
inline void cl::put_i(int j)
{i=j;}
int main()
{cl s;
s.put_i(10);
cout<<s.get_i();
return 0;}
Строка
s.put_i(10);
функционально эквивалентна следующей инструкции присваивания
s.i=10;
Поскольку переменная i по умолчанию закрыта в рамках класса cl, эта строка не может реально существовать в коде функции main(), но за счет встроенной функции put_i мы достигли того же результата , одновременно избавившись от затрат системных ресурсов, связанных с вызовом функции.
Существует еще один способ создания встраиваемой функции. Он состоит в определении кода для метода класса в самом объявлении класса. Любая функция, которая определяется в объявлении класса, автоматически становится встраиваемой. В этом случае необязательно предварять ее объявление ключевым словом inline.
class cl
{int I;
public:
int get_i()
{return i;}
void put_i(int j)
{i=j;}};
37. Алгоритмы хранения разреженных векторов
Разреженным вектором называется массив, в котором не все элементы фактически используются, присутствуют на своих местах или нужны. Разреженные векторы являются исключительно ценным средством в том случае, когда размер массива, необходимый для работы приложения, достаточно велик(возможно даже превышает размер доступной памяти) и при этом далеко не все элементы массива будут использоваться. Таким образом, разреженный вектор будет массивом большого размера с малым количеством фактически присутствующих элементов.
Если для работы приложения нужен массив, размер которого превышает физический объем памяти, имеющейся в компьютере, то для поддержки массива нам и придется использовать механизм разреженного вектора. Даже в тех случаях, когда большой массив и может разместиться в памяти, создание такого массива является нерациональным, поскольку при создании подобного массива вся память, необходимая для его хранения, выделяется единовременно. Это означает, что выделенная для хранения массива память будет недоступна другим частям программы или процессам операционной системы. Таким образом, все методы работы с разреженными векторами имеют одну общую черту-память для хранения элементов вектора выделяется только по мере надобности.
Одним из наиболее простых методов реализации разреженных векторов является использование связного списка для хранения фактически используемых элементов массива. Когда используется этот подход, при индексации логического массива(массива воображаемого), выполняется поиск по списку, и возвращается значение, ассоциированное с индексом.
Связным списком называется совокупность позиций, связанных в том или ином порядке. Каждая позиция содержит элемент списка и номер ячейки, в которой хранится следующий элемент списка.
В общем случае, схема хранения списка состоит из трех массивов.
1) массив позиций.
2)массив элементов.
3)массив указателей позиций следующих элементов +указатель начала списка.
Также возможно хранение разреженного вектора при помощи бинарного дерева, которое по сути представляет собой усовершенствованную версию связного списка с двойными ссылками. Основное его преимущество по сравнению со связным списком заключается в том, что он обеспечивает быстрый поиск. Это означает, что вставка новых элементов и просмотр существующих могут осуществляться очень быстро.
Для успешной реализации и хранения разреженного массива в качестве бинарного дерева требуется сложная многоуровневая иерархия классов. Мы предполагаем наличие трех классов, базового класса содержащего информацию об элементах и индексах элементов вектора, данный класс наследуется классом параметризированного бинарного дерева для реализации разреженных векторов, а он в свою очередь наследуется классом разреженного вектора.
-
Объекты как параметры функций
Классовый объект можно передать функции точно так же, как значение любого другого типа данных. Объекты передаются функциям путем использования обычного C++ соглашения о передаче параметров по значению. Таким образом, функции передается не сам объект, а его копия. Следовательно, изменения, внесенные в объект при выполнении функции, не оказывают никакого влияния на объект, используемый в качестве аргумента для функции.
#include <iostream>
using namespace std;
class OBJ
{int I;
public:
void set_i (int x ) {i=x;}
void out_i() {cout<<i<<” ”;}};
void f(OBJ x)
{x.out_i();
x.set_i(100);
x.out_i();}
int main()
{OBJ o;
f(o);
return 0;}
-
Алгоритм скалярного умножения разреженных векторов
Разреженный вектор – это разреженная матрица-строка или матрица-столбец, поэтому рассмотрим скалярное умножение разреженных векторов (как частный случай работы с матрицей) с использованием так называемого расширенного массива указателей IP. Например, есть два разреженных вектора a и b размером N. Значения векторов приведены в таблице.
Вектор | Индекс J | ||||||
| 2
3
| 3 | 4 | 5 | 7
4.4
| 8 | 11
7
| |
| a | 1.5 |
| -0.4 | -8 | |||
| b | 1.2 | -2.2 | 0.4 |
| |||
Представление этих векторов в разреженном строчном формате будет следующим:
Индексы элементов вектора a : JА = 2; 7; 3; 8; 5.
Значения элементов вектора a : AN = 3; 4,4; 1,5 –8; -0,4.
Индексы элементов вектора b : JB = 4; 3; 11; 5.
Значения элементов вектора b : BN = -2,2; 1,2; 7; 0,4.
Данная схема хранения является упакованной, так как хранятся только ненулевые элементы, и неупорядоченной, так как номера индексов могут идти и не по возрастанию (что и показано в данном примере).
Допустим, необходимо вычислить скалярное произведение векторов a и b:
h = ∑ aibi (i=1,n)
При вычислении стандартным способом нужно N2 просмотров массива. Для сокращения алгебраических операций удобно во время работы хранить расширенный (по размерности массивов a и b) массив указателей IP (его начальное состояние - нулевое). Этот массив заполняется путем одного просмотра массива JA
Алгоритм разреженного вычисления следующий:
1. Просматривается массив JA (первое значение –2) и в соответствующий элемент массива IP (для данного примера – во второй элемент) вписывается индекс массива JA (т.е. –1). Таким образом хранятся указатели позиций ненулевых элементов в АN.
Получается массив указателей IP в виде
1 2 3 4 5 6 7 8 9 10 11 12...
IP 0 1 3 0 5 0 2 4 0 0 0 0,
Где вторая строка – номер индекса в JA.
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















