You are on page 1of 4

Tablice i wektory

Wektor jest obiektem, który zawiera w sobie tablicę. Wektor daje lepsze możliwości dostępu do
danych w tablicy i czyni ten dostęp bardziej bezpieczny. W przeciwieństwie do tablicy wektor jest
obiektem i dostarcza metod, które działają na tym obiekcie (wywołanie: wektor.metoda(), przykłady
poniżej).
Podobnie jak tablica, wektor zawiera dane określonego typu. Typ danych trzeba zadeklarować w
definicji wektora, np.:

vector<int> liczby;
vector<float> liczby;
vector<char> znaki;
vector<string> napisy;

W przeciwieństwie do tablicy rozmiar wektora może się zmieniać. Przykłady powyżej definiują puste
wektory o długości zero. Długość wektora i dane początkowe można ustalić w definicji, np.

vector<int> liczby(10); // 10 zer


vector<int> liczby (10, 1); // 10 jedynek
vector<int> liczby {0,1,2,3,4,5,6,7,8,9}; // liczby od 0 do 9
vector<char> znaki(10, ' '); // 10 spacji
vector<char> litery{ 'a', 'b', 'c' }; // trzy znaki 'a', 'b', 'c'
vector<string> imiona{ "Wera", "Jola", "Ania"}; // trzy lancuchy znakow

Wektor można rozszerzać o nowe elementy, np.

vector<char> litery{ 'a', 'b', 'c' }; // trzy znaki 'a', 'b', 'c'
litery.push_back('d');

dodaje nowy znak na końcu wektora.


Wektory można „zerować”, np.

litery.clear();

zwraca pusty wektor. Metoda empty() zwraca true, jeśli wektor jest pusty.
W przeciwieństwie do tablicy, wektor „zna” swój rozmiar. Liczba elementów wektora zwracana jest
metodą size(). Np. litery.size() z przykładu powyżej zwraca 4.
Podobnie jak w tablicy, dostęp do elementów wektora możliwy jest przez indeks. Pierwszy element
wektora ma indeks zero. Każde wyrażenie, które daje wartość typu int może być użyte jako indeks,
np. dla wektora vector<int> liczby {0,1,2,3,4,5,6,7,8,9};

int i = liczby[0]; // i rowna sie 0


liczby[0] = 999; // teraz pierwszy element rowna się 999
int j = 4; int i = liczby[j+5]; // i rowna sie 9
int j = 4; int i = liczby[j*5]; // blad (może byc nie wykryty)
int i = liczby[liczby[liczby[1]]]; // ile rowna się i?

Metoda dostępu at() sprawdza poprawność indeksu, np.

int j = 4; int i = litery.at(j * 5); // blad, program zostanie przerwany

Podobnie jak w przypadku tablicy pętla for nadaje się dobrze do przejścia przez wszystkie elementy
wektora (iteracja), np.
for (int i = liczby.size(); i >= 0; i--)//??
{
cout << liczby [i] << endl; // albo liczby.at(i)
}

drukuje liczby w odwrotnej kolejności.


Inna metoda iteracji jest dostepna tylko dla wektorow, np.

for (string imie : imiona)


{
cout << imie << endl;
}
Drukuje imiona w naturalnej kolejności.
W przeciwieństwie do tablic wektory można kopiować, np.

vector<int> stad{ 1, 2, 3 }; // trzy liczby 1,2,3


vector<int> dotad; // pusty wektor
dotad = stad; // dotad zawiera teraz kopie stad, tj. trzy liczby 1,2 3
(w przypadku tablic kopiowane są wskaźniki na początek tablicy, a nie zawartość tablicy).

Wektory można używać jako argumenty funkcji. Male wektory przekazuje się przez kopie, np.

void Drukuj(vector<int> liczby) // kopia argumentu aktualnego


{
for (int liczba : liczby) cout << liczba << " ";
cout << endl;
}

Duże wektory można przekazać przez referencję. Żeby uniknąć ewentualnej zmiany argumentu
wejściowego w funkcji, należy argument formalny zadeklarować jako const:

void Drukuj(const vector<int>& liczby) // adres argumentu aktualnego


{
for (int liczba : liczby) cout << liczba << " ";
cout << endl;
}
Podobnie jak tablice wektory mogą mieć wiele wymiarów (temat na przyszlosc) .
Programy pw 89, pw 90, pw 89a
Przykład 1: Obliczanie sumy i wartości średniej liczb w wektorze

#include "iostream"
#include "vector"
#include "string"
using namespace std;

int main()
{
int rozmiar;
double suma = 0.0;

cout << "Podaj rozmiar wektora: ";


cin >> rozmiar;

vector<double> liczby(rozmiar);
cout << "Napisz " << liczby.size() << " liczb oddzielajac je spacjami: ";

for (int i = 0; i < liczby.size(); i++)


{
cin >> liczby[i];
suma += liczby[i];
}
cout << "Suma = " << suma << endl;
cout << "Wartosc srednia = " << suma/liczby.size() << endl;

return 0;
}
Ćwiczenie: Dopisz pętle drukująca zawartość wektora używając
1. Metody dostępu at()
2. alternatywnej metody iteracji.

Przykład 2: Liczby pierwsze


#include "vector"
#include "iostream"
using namespace std;

void Drukuj(vector<int> liczby)


{
for (int liczba : liczby) cout << liczba << " ";
cout << endl;
}

bool JestLiczbaPierwsza(int n)
{
if (n < 2)
return false;
else
{
bool wynik = true;
double r = n, root = sqrt(r);
for (int i = 2; wynik && i <= root; i++)
{
wynik = (n % i != 0);
}
return wynik;
}
}

vector<int> ZnajdzLiczbyPierwsze(int min, int max)


{
vector<int> liczby_pierwsze;
for (int i = min; i <= max; i++)
{
if (JestLiczbaPierwsza(i)) liczby_pierwsze.push_back(i);
}
return liczby_pierwsze;
}

int main(){
int min, max;
cout << "Program znajduje liczby pierwsze w podanym zakreis liczb." << endl;
cout << "Podaj namniejsza i najwieksza liczbe oddzielejac je spacja ";
cin >> min >> max;

vector<int> liczby_pierwsze = ZnajdzLiczbyPierwsze(min, max);


Drukuj(liczby_pierwsze);

return 0;
}
Ćwiczenie: Zamień w funkcji Drukuj sposób przekazywania wektora liczby „przez kopie” na „przez
referencje”.

You might also like