Friday, June 8, 2012

Vectors


The vector class supports a dynamic array. This is an array that can grow as needed.

The template specification for vector is shown here:
template <class T, class Allocator = allocator<T> > class vector
где Т это тип данных, который будет сохранен и Allocator specifies the allocator, which
defaults to the standard allocator.

vector has the following constructors:

explicit vector(const Allocator &a = Allocator( ) );
explicit vector(size_type num, const T &val = T ( ),
const Allocator &a = Allocator( ));
vector(const vector<T, Allocator> &ob);
template <class InIter> vector(InIter start, InIter end,
const Allocator &a = Allocator( ));

The first form constructs an empty vector. The second form constructs a vector that
has num elements with the value val. The value of val may be allowed to default. The
third form constructs a vector that contains the same elements as ob. The fourth form
constructs a vector that contains the elements in the range specified by the iterators
start and end.

For maximum flexibility and portability, any object that will be stored in a vector
should define a default constructor. It should also define the < and == operations.
Some compilers may require that other comparison operators be defined. (Since
implementations vary, consult your compiler's documentation for precise information.)
All of the built-in types automatically satisfy these requirements.

Declaration of vectors:

vector<int> iv; // create zero-length int vector
vector<char> cv(5); // create 5-element char vector
vector<char> cv(5, 'x'); // initialize a 5-element char vector
vector<int> iv2(iv); // create int vector from an int vector


The following comparison operators are defined for vector:
==, <, <=, !=, >, >=, []








The Container Classes

Это STL objects that actually store data.
Containers:

Container                   Description                 Required Header
bitset                             A set of bits.                       <bitset>
deque                        A double-ended queue.          <deque>
list                                   A linear list.                         <list>
map                        Stores key/value pairs in             <map>
                            which each key is associated
                                  with only one value.
multimap             Stores key/value pairs in which       <map>
                           one key may be associated with
                                 two or more values.
multiset                  A set in which each element          <set>
                            is not necessarily unique.
priority_queue             A priority queue.                   <queue>
queue                                A queue.                        <queue>
set                      A set in which each element             <set>
                                   is unique.
stack                              A stack.                             <stack>
vector                        A dynamic array.                     <vector>

Other STL Elements

Each container has defined for it an allocator. Он управляет распределением памяти для container. The default allocator is an object of class allocator, but you can define your own allocators.

Некоторые algorithms и containers используют special type of function called a predicate.
There are two variations of predicates: unary and binary. A unary predicate takes one argument, while a binary predicate has two. These functions return true/false results. But the precise conditions that make them return true or false are defined by you. For the rest of this chapter, when a unary predicate function is required, it will be notated using the type UnPred. When a binary predicate is required, the type BinPred will be used. In a binary predicate, the arguments are always in the order of first,second. For both unary and binary predicates, the arguments will contain values of the type of objects being stored by the container.

Some algorithms and classes use a special type of binary predicate that compares two elements. Comparison functions return true if their first argument is less than their second. Comparison functions will be notated using the type Comp.

Two other entities that populate the STL are binders and negators. A binder binds an argument to a function object. A negator returns the complement of a predicate.

One final term to know is adaptor. In STL terms, an adaptor transforms one thing into another. For example, the container queue (which creates a standard queue) is an adaptor for the deque container.

STL

STL базируется на containers, algorithms, iterators.

Containers - объекты, которые содержат другие объекты.
Examples:
Sequence containers: vector, deque, list
Associative containers(based on keys): map

Each container class defines a set of functions that may be applied to the container.

Algorithms act on containers. (initialization, sorting, searching and transforming the contents of containers).

Iterators are objects that act, more or less, like pointers. They give you the ability to cycle through the contents of a container in much the same way that you would use a pointer to cycle through an array.

Есть 5 типов итераторов:

Random Access - Store and retrieve values. Elements may be accessed randomly.
Bidirectional - Store and retrieve values. Forward and backward moving.
Forward - Store and retrieve values. Forward moving only.
Input - Retrieve, but not store values. Forward moving only.
Output - Store, but not retrieve values. Forward moving only.


Iterators are handled just like pointers. You can increment and decrement them. You
can apply the * operator to them. Iterators are declared using the iterator type defined
by the various containers.

The STL also supports reverse iterators. Reverse iterators are either bidirectional or
random-access iterators that move through a sequence in the reverse direction. Thus, if
a reverse iterator points to the end of a sequence, incrementing that iterator will cause
it to point to one element before the end.


Term    Represents
BiIter - Bidirectional iterator
ForIter - Forward iterator
InIter  - Input iterator
OutIter - Output iterator
RandIter - Random access iterator



Потоковые указатели

Это get() и put() указатели. get() - текущая позиция чтения. put() - текущая позиция записи.

ifstream обладает указателем get()
ofstream обладает указателем put()
fstream обладает обоими указателями.


Чтение из файла


#include <fstream>
#include <iostream>
using namespace std;

int main()
{
setlocale(LC_ALL,"Russian");

ifstream dragons("dragons.txt");

char buffer[50];

if(!dragons.is_open())
{
cout << "Ошибка, невозможно открыть файл";
exit(1);//1 так как возникла ошибка
}

while(!dragons.eof())
{
dragons.getline(buffer, 49);// getline() для чтения из файла в buffer
cout << buffer << endl;
}

dragons.close();

int a;
cin >> a;

return 0;
}

Запись в файл


//Write text to txt file.

#include <fstream>

using namespace std;

int main()
{
ofstream dragons("dragons.txt"); //конструктор то же самое что и метод open()

if(dragons.is_open())//проверяем корректность открытия файла
{
dragons << "Медный дракон" << endl
<< "Бронзовый дракон" << endl
<< "Серебряный дракон" << endl
<< "Золотой дракон" << endl;
}

dragons.close();

return 0;
}

open(filename, mode) эти связать объект файлового потока с рабочим файлом.

Tuesday, June 5, 2012

Dynamically allocated storage(когда в классе есть мемберы поинтеры)

Когда члены класса содержат dynamically allocated data structures (манипулирование поинтерами), нужно создать:
1)Деструктор для очищения выделенной памяти.
2)Overload the assignment operator так как динамически выделенная память должна быть скопирована в назначенный объект после освобождения памяти выделенной для назначенного объекта.
3)Создать copy constructor для deep copying объекта, когда этот объект передан by value в функцию. Например Test (Test const & t).

Overloaded operators

Примеры:
fraction opeartor * (fraction f1, fraction f2)
{
fraction product;
product.num = f1.num * f2.num;
product.den = f1.den * f2.den;
return product;
}

ostream& opeartor <<  (ostream& out, fraction& f)
{
out << f.num << '/' << f.den;
return out;
}

Overloaded functions

Это функции класса с одинаковым именем, но с разными параметрами.

Enumerators

typedef enum {RED, GREEN, BLUE} color_type;
или
enum color_type {RED, GREEN, BLUE};

Data types

char, unsignes char
boolean
short, undigned short
int, undigned int, long, unsigned long
float
double, long double

Function prototype and function definition

Function prototype:
Это заголовок функции, включающий в себя имя, возвращаемый тип и параметры. Прототип говорит компилятору, что есть такая функция в файле. То есть это как интерфейс.

Function definition:
Содержит сам код функции.

Передача аргумента в функцию

Есть три основных способа передачи аргумента:
1)By value
2)By reference
3)By pointer

By value:
Аргумент копируется в локальный параметр.
By reference:
Передается адрес аргумента. Если const int& variable то значение variable нельзя модифицировать.
By pointer:

Четыре способа передать функции указатель:

1)Неконстантный указатель на неконстантные данные - данные можно модифицировать через разыменованный указатель, а сам указатель может быть модифицирован для ссылки на другие данные. Всё без const.

2)Неконстантный указатель на константные данные - это указатель, который можно модифицировать, чтобы он ссылался на любые элементы данных подходящего типа, но данные, на которые он ссылается, не могут быть модифицированы. Пример: void printCharacter(const char*);

3)Константный указатель на неконстантные данные - это указатель, который всегда ссылается на одно и то же место в памяти; данные в этом месте можно модифицировать через указатель. Пример: int * const ptr = fix;

4)Константный указатель на константные данные - Такой указатель всегда указывает на одно и то же место в памяти и находящиеся в этом месте данные нельзя модифицировать. Пример: const int *const ptr = &x;

Процесс компиляции

Компиляция состоит из четырех шагов:
Все начинается с текстового файла с расширением .cpp, который содержит сам код.
1)Первым шагом является C++ preprocessor, а точнее копирует содержание включенных заголовочных файлов (например #include <iostream>) в cpp файл, генерирует макро код (например #define getmax(a,b) a>b?a:b), а также заменяет константы с #define их значениями.
2) Компиляция кода в машинный код, специфичный для каждой платформы.
3)Машинный код переводится в объектный код.
4)Объектный код сгенерированный компилятором соединяется с объектным кодом от библиотек. Затем создается выполняемый код.

Что такое C++?

C++ это расширение языка C. Он включает ООП (объектно ориентированное программирование). Разработан Бьёрном Страуструпом в 1980 году.
C это процедурный язык (не объектно ориентированный). C соединяет в себе лучшие качества языков высокого уровня и языков ассемблера. Microsoft Windows, Mac OS X и GNU/Linux написаны на C.
C++ очень гибок, а конкретнее программист может манипулировать поинтерами и адресами.

Первое сообщение

Я создал этот блог для себя, для изучения языков программирования, а конкретно C++. Может кому то еще он покажется интересным и нужным.