Kontener tablicy - vector

Vector jest to tak zwany kontener na dane(pojemnik), inaczej dynamiczna tablica. W tej tablicy mamy dostęp do każdego jej elementu oraz możemy w każdym momencie zwiększać jej wielkość. Kilka podsatwowych funkcji:

push_back() - dodaje do końca tablicy nowy element podany w nawiasie
push_back() - dodaje do końca tablicy nowy element podany w nawiasie
insert() - dodaje element do dynamicznej tablicy w podanym miejscu
begin() - wskazuje pierwszy element dynamicznej tablicy
end() - wskazuje na koniec dynamicznej tablicy
size() - zwraca ilość elementów tablicy


#include 
#include 
using namespace std;

int main()
{
   vector < int > tab;
    //zapis
    int x = 0;
    for( int i = 0; i < 10; i++ )
    {
        tab.push_back( x );
        x = x + 2;
    }
    //odczyt
    for( int i = 0; i < tab.size(); i++ )
    {
        cout << tab[i] << endl;
    }
    return 0;
}


Z vectorem możemy pracować tak jak z tablicami, możemy przypisywać wartości elementom vectora odwołując się poprzez indeks:

	
#include <iostream>
#include <vector>


using namespace std;

int main()
{
  vector<int> tablica_intow(3);
  tablica_intow[0]=3451;
  tablica_intow[1]=432;
  tablica_intow[2]=-42;
  cout<<tablica_intow[0]<<" "<<tablica_intow[1]<<" "<<tablica_intow[2]<<endl;
  
  return 0 ;
}
	
	


Metoda size() - wielkość vectora

Pierwszą metodą klasy vector, jaką poznamy, to metoda size(), służy ona do zwracania, aktualnej wielkości vectora, czyli ilości elementów z których się składa. Dzięki niej na bieżąco wiemy jak wielki jest nasz vector.

	
#include <iostream>
#include <vector>


using namespace std;

int main()
{
  vector<int> tablica_intow(5);
  cout<<tablica_intow.size()<<endl;
//metodą size zwracamy wielkość vectora tablica_intow, czyli u nas 3

  
//wielkości tablicy często używamy w pętlach, jako warunku zakończenia pętli
//dopisujemy elementy do tablicy tyle ile wynosi wielkosc tablicy
  for(int i=0;i<tablica_intow.size();i++) tablica_intow[i]=i+10;
  
// Wypisujemy elementy tablicy:
  for(int i=0;i<tablica_intow.size();i++) cout<<tablica_intow[i]<<" ";
  cout<<endl;
  
  return 0 ;
}
	
	


Metoda resize() - zmiana wielkości vectora

Kolejną metodą jest resize(). Ustawia ona nową wielkość wektora, w ten sposób możemy szybko zwiększać lub zmniejszać nasz vector. W nawiasie podajemy nową ilość elementów vectora. Dla przykładu, jeżeli mamy vector 5 elementowy, i nowa wartość jaką mu nadamy będzie 3, to pierwsze 3 elementy pozostają bez zmian, natomiast 2 ostatnie, które się już nie mieszczą w vectorze zostają po prostu usunięte. W przypadku powiększania vectora, wszystkie elementy, które były w vectorze pozostają bez zmian, a te które zostały dodane, przyjmą wartości, które są aktualnie w pamięci.

	
#include <iostream>
#include <vector>


using namespace std;

int main()
{
  vector<int> tablica_intow(60);
  tablica_intow.resize(40);
//metodą resize nadajemy nową wielkość vectora tablica_intow

  tablica_intow.resize(tablica_intow.size()+10);
//metodą resize+size zwiększamy wielkość vectora tablica_intow

  tablica_intow.resize(tablica_intow.size()-20);
//metodą resize+size zmniejszamy wielkość tablica_intow
  
  return 0 ;
}
	
	


Metoda clear() - wyczyszczenie vectora

Metoda clear(), służy do usuwania wszystkich wartości z vectora, czyli ustawienia do do wielkości 0-elementowej. Pamiętajmy, że vector to tablica dynamiczna, dlatego przed wyjściem z programu, trzeba zwolnić wszystkie elementy tablicy.

	
#include <iostream>
#include <vector>


using namespace std;

int main()
{
    vector<int> tablica_intow; //vector 0-elementowy

  tablica_intow.resize(40); //vector 40-elementowy

  cout<<tablica_intow.size()<<endl;
  tablica_intow.clear();
//znowu vector 0-elementowy

  cout<<tablica_intow.size()<<endl;
  
  return 0 ;
}
	
	

Metody push_back()/pop_back() - dodawanie/usuwanie ostatniego elementu vectora

Metoda push_back() służy dodawaniu nowej wartości na koniec vectora, za wszystkie istniejące wartości w vectorze. Należy zwrócić uwagę, także na fakt, że wielkość vectora zwiększy się o 1 element. W nawiasie podajemy wartość nowo dodawanego elementu.
Metoda pop_back() usuwa ostatni element w vectorze, zmniejszając jego rozmiar o 1 element.

	
#include <iostream>
#include <vector>


using namespace std;

int main()
{
  vector<int> tablica_intow;
  tablica_intow.push_back(10);
  tablica_intow.push_back(20);
  tablica_intow.push_back(-30);
  tablica_intow.push_back(100);
  cout<<tablica_intow.size()<<endl; //po dodaniu 4 elementów, vector będzie 4-elementowy

  for (int i = 0; i<tablica_intow.size(); i++)
  {
  	cout << tablica_intow[i] << endl; //wypisuje elementy
  }

  tablica_intow.pop_back(); //usuwamy ostatnią wartość, vector będzie 3-elementowy

  cout<<tablica_intow.size()<<endl;
  for (int i = 0; i<tablica_intow.size(); i++)
  {
  	cout << tablica_intow[i] << endl; //wypisuje elementy
  }
  
  
  tablica_intow.clear();
  
  cout<<tablica_intow.size()<<endl; //teraz tablica jest pusta i ma 0 elementow
  
  return 0 ;
}
	
	

Metoda insert() - wstawianie elementu do vectora

Gdy wstawiamy element na koniec vectora sprawa jest prosta, bo nie robimy nic poza tym. Inaczej jest w przypadku wstawiania elementu w inne miejsce. Aby wstawić element nie na koniec to trzeba przesunąć wszystkie elementy, przed tym nowym elementem. Dla przykładu mamy tablicę 4-elementową, chcemy na miejsce drugie o indeksie 1, wstawić nową wartość. W tym celu, musimy przesunąć wartości o indeksach 1,2 i 3 o jedno miejsce do przodu, więc takie przesuwanie jest mało wydajne. Najmniejsza wydajność jest gdy chcemy wstawić element na pierwsze miejsce, wtedy musimy przesunąć wszystkie elementy w tablicy.

Metoda insert przyjmuje 2 argumenty, pierwszy to indeks w vectorze, na który ma być wstawiony element, właśnie tutaj podajemy iterator(wskaźnik) na element, w który chcemy wstawić nową wartość. Załóżmy, że stworzymy tablicę 4-elementową i w sam środek(trzeci element, indeks 2) chcemy wstawić nową wartość.

	
#include <iostream>
#include <vector>


using namespace std;

int main()
{
  vector <int> tab;
  tab.push_back(10);
  tab.push_back(20);
  tab.push_back(-30);
  tab.push_back(100);
  for(int i=0;i<tab.size();i++) cout<<tab[i]<<" "; //wyświetlamy zawartość vectora

  cout << endl;
  vector < int >::iterator it=tab.begin()+=2; //iterator na trzeci element
  
  tab.insert(it,3000); //wstawiamy wartość 3000 jako trzeci element

  for(int i=0;i < tab.size();i++) cout<<tab[i]<<" "; //wyświetlamy zawartość vectora

  cout << endl;
  tab.clear();
  return 0 ;
}
	
	

Metoda erase() - usuwanie elementu z vectora

Metodą erase() możemy usunąć element z dowolnego miejsca w vectorze. Przy czym należy pamiętać, że gdy usuwamy element to elementy za usuwanym punktem będą przesunięte o 1 do tyłu. Oczywiście tutaj także będziemy potrzebowali iteratora do usuwanego elementu, który podajemy w nawiasie:

	
#include <iostream>
#include <vector>


using namespace std;

int main()
{
  vector <int> tab;
  tab.push_back(10);
  tab.push_back(20);
  tab.push_back(-30);
  tab.push_back(100);
  for(int i=0;i < tab.size();i++) cout << tab[i] << " ";
//wyświetlamy zawartość vectora

  cout << endl;
  vector < int >::iterator it=tab.begin()+=2;
//iterator na trzeci element

  tab.erase(it);
//usuwamy trzeci element

  for(int i=0;i<tab.size();i++) cout<<tab[i]  << " ";
//wyświetlamy zawartość vectora

  cout << endl;
  tab.clear();
  return 0 ;
}
	
	


Sortowanie zawartości kontenerów (vector)



#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>


using namespace std;

int main()
{
  vector < int > tab;
    srand( time( NULL ) );
    //zapis
    
    for( int i = 0; i < 10; i++ )
    {
        int ile = rand() % 30;
        tab.push_back( ile );
    }
  for(int i=0;i < tab.size();i++) cout << tab[i] << " "; //wyświetlamy zawartość vectora

  cout << endl;
  
  
  sort( tab.begin(), tab.end() );

  for(int i=0;i < tab.size();i++) cout << tab[i] << " "; //wyświetlamy zawartość vectora

  cout << endl;
  tab.clear();
  return 0;
}