Вектори

Вектори – це безперервні блоки пам’яті, що зберігають множину елементів того самого типу. Вони оголошуються за допомогою зазначення кількості елементів, що повинно бути позитивним цілим константним виразом, обмеженим квадратними дужками[]. Мають тільки одну розмірність. Багатомірні масиви, використовувані в інших мовах, у С++ представляються вектором покажчиків на вектори.

 

float vf[10]; // вектор з 10 float

int vvi[50][8]; // 50 векторів з 8 int кожний

char* vpc[5]; // вектор з 5 покажчиків на char

 

Можуть бути ініціалізовані (якщо мають статичний клас пам’яті) набором значень, обмежених фігурними дужками. Особливий випадок – це вектор символів (char), що може бути ініціалізований рядковою константою.

Перше максимальне число елементів може бути опущено, воно дорівнює кількості ініціалізуючих значень. Якщо кількість значень менше заданої кількості елементів, то елементи, що залишилися, ініціалізуються нулями (або еквівалентними значеннями). Якщо задані всі значення, то фігурні дужки можуть бути опущені.

 

char greeting[] = “Yes, master?”; // 13 елементів

int a[5] = {7,6,9}; // a[3] = a[4] = 0

int b[][2] = {{1,2},{3,4},{5,6}}; // [3][2]

int c[][2] = {1,2,3,4,5,6}; // {} опущені

int d[][2] = {{1},{2},{3}}; //{}не можуть бути опущені d[0][1] = d[1][1] = d[2][1] = 0

 

Ім’я вектора саме по собі є адресою першого елемента цього вектора:

 

v = &v[0]

 

Єдиним винятком є використання імені вектора в операції sizeof. При цьому результатом операції буде кількість байт, що займає весь вектор.

2. Ініціалізація багатовимірних масивів

Приклад:

 

// Multidimention.cpp

#include <cstdio>

#define NUMMONTS 12

 

char months[NUMMONTS][4]=

{

"Jan","Feb","Mar","Apr",

"May","Jun","Jul","Aug",

"Sep","Oct","Nov","Dec"

};

 

void main()

{

int month;

for(month=0;month<NUMMONTS;month++)

puts(months[month]);

}

 

Приклад:

 

//MultiArr.cpp

#include <iostream>

using namespace std;

 

char v[2][5] =

{

{'a','b','c','d','e'},

{'0','1','2','3','4'}

};

 

void main()

{

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

{

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

cout<<"v["<<i<<"]["<<j<<"] = "<<char(v[i][j])<<" ";

cout<<'n';

}

}

 

3. Операції розподілу пам’яті

new type – виділяє простір для типу type і повертає адресу. Для класів, крім того, викликається конструктор. За відсутності достатнього обсягу пам’яті повертається нуль.

new type [ie] – виділяє простір для масиву з ie елементів типу type і повертає адресу. Для класів конструктор викликається для кожного елемента.

delete pe – звільняє пам’ять, на яку вказує pe. Для класів викликається деструктор. Якщо pe має нульове значення, то операція delete не виконує ніяких дій.

delete [] pe – звільняє пам’ять, зайняту масивом, на який вказує pe. Для класів деструктор викликається для кожного елемента масиву.