pridani poznamek ke containerum zatim pouze s vectory poznamky z hodim maji ted vlastni podslozku lehka oprava kodu vsede mozne, hlavne pridani cpp pro lepsi cteni a oprava drobnych chybek
161 lines
4.4 KiB
Markdown
161 lines
4.4 KiB
Markdown
# Vector
|
|
- [geegs for geegs](https://www.geeksforgeeks.org/cpp/vector-of-strings-in-cpp/) - to jsem prakticky vykradl
|
|
- **vlastně třída, která je implementací dynamického pole**
|
|
- Proč se to jmenuje vector? Protože to autor standardní knihovny (Alex Stepanov) prostě nešikovně pojmenoval
|
|
> "One could argue that valarray should have been called vector because it is a traditional mathematical vector and that vector should have been called array. However, this is not the way the terminology evolved." - Bjarne Stroustrup (autor jazyka)
|
|
|
|
Vektory mají svoje funkce, které umožňují základní operace s polem typu: přidání prvku na začátek a na konec, přidání prvku na n-tou pozici, přepsaní a přístup, mazání prvků...
|
|
## Inicializace
|
|
Syntax: `vector<typ_polezek> v1;`
|
|
Příklad inicializace:
|
|
```cpp
|
|
#include <iostream>
|
|
#include <vector>
|
|
|
|
int main(void)
|
|
{
|
|
vector<int> v1; //neinicializovaný vektor
|
|
vector<int> v2 = {1, 2, 3}; //vekor s prvky 1 2 3
|
|
vectro<int> v3(8, 42); //vektor o 8 prvcích o hodnotě 42
|
|
|
|
vector<char> v4 = {'f', 's', 'o', 'c', 'i', 'e', 't', 'y'};
|
|
vector<string> v5 =
|
|
{
|
|
"Do not go gentle into that good night,",
|
|
"Old age should burn and rave at close of day;",
|
|
"Rage, rage against the dying of the light."
|
|
};
|
|
vector<nejaka_trida> v6;
|
|
|
|
return 0;
|
|
}
|
|
|
|
```
|
|
|
|
## begin(), end(), empty()
|
|
- `begin()` a `end()` jsou to funkce vektoru, které vrací iterátory na první a poslední hodnotu.
|
|
- Když je vector prázdny platí: `v.begin() == v.end()`. To můžeme taky poznat pomocí funkce `v.end()`.
|
|
- `v.end()` vždy ukazuje **na prázdnou hodnotu za posledním prvkem vektoru**, kam lze bezstarostně zapisovat další prvek, když třeba.
|
|
|
|
## Přidání prvku
|
|
- máme funkce `v.push_back()` a `v.insert()`
|
|
- `v.push_back(hodnota)` přidá hodnotu na konec vektoru
|
|
- Funkce `v.insert()` přidává hodnotu/hodnoty na n-tý prvek a má několik různých možností zápisu:
|
|
```cpp
|
|
#include <iostream>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
int main(void)
|
|
{
|
|
//prazdny koncert
|
|
vector<string> koncert;
|
|
//pridani prvniho prvku na konec pomoci push_back
|
|
koncert.push_back("prvni pisnicka");
|
|
//pridani prvku na posledni pozici
|
|
koncert.insert(koncert.end(), "lidi jdou pít do klubu")
|
|
//pridani 3 prvku na 1. pozici (tedy prvek na posledni pozici se posune o 3)
|
|
koncert.insert(koncert.begin() + 1, 3, "opravdu posledni pisnicka");
|
|
|
|
for (string udalost : koncert)
|
|
{
|
|
cout << udalost << endl;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//VYPIS:
|
|
//prvni pisnicka
|
|
//opravdu posledni pisnicka
|
|
//opravdu posledni pisnicka
|
|
//opravdu posledni pisnicka
|
|
//lidi jdou pít do klubu
|
|
```
|
|
|
|
Možnosti `insert`:
|
|
```cpp
|
|
vector<int> a;
|
|
vector<int> b;
|
|
a.insert(pozice a, hodnota);
|
|
a.insert(pozice a, pocet_prvku, hodnota);
|
|
a.insert(pozice a, poc_poz_jineho_vek, konc_pozice_jin_vek);
|
|
|
|
//přepíše vektor b na začátek vektoru a
|
|
a.insert(a.begin(), b.begin(), b.(end))
|
|
```
|
|
|
|
## Přístup k prvkům a změna
|
|
- v podstatě mám 2 možnosti a to `v[i]` nebo `v.at(i)`
|
|
- Fungují stejně akorát `v.at()` vyhodí výjimku při pokusu přistupovat mimo pole a je nepatrně pomalejší
|
|
- výjimka je `std::out_of_range`
|
|
|
|
```cpp
|
|
#include <iosteam>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
int main(void)
|
|
{
|
|
vector<string> v = {"Ronald", "Artiom", "Chang", "Waldo"};
|
|
cout << v[0] << endl;
|
|
cout << v.at(3) << endl;
|
|
//cout << v.at(4) << endl; //vyhodí výjimku out of range
|
|
|
|
//zmena jmen
|
|
v[1] = "Mercedes";
|
|
v.at(2) = "Anička";
|
|
//v.at(7) = "Pavla"; //vyhodi vyjimku
|
|
|
|
return 0;
|
|
}
|
|
```
|
|
|
|
## size a využití
|
|
- `v.size()` vrací počet prvků
|
|
|
|
```cpp
|
|
#include <iosteam>
|
|
#include <vector>
|
|
using namespace std;
|
|
|
|
int main(void)
|
|
{
|
|
vector<string> v = {"Ronald", "Artiom", "Chang", "Waldo"};
|
|
cout << v.size() << endl; //vypíše 4
|
|
|
|
for (int i = 0; i < v.size(); i++)
|
|
{cout << v[i] << " ";} //vypíše všechny jména vedle sebe
|
|
return 0;
|
|
}
|
|
```
|
|
|
|
## Mázaní prvků
|
|
- mám 2 možnosti a to `v.pop_back()` a `v.erase()`
|
|
- `v.pop_back()` vymaže poslední prvek z vektoru
|
|
- `v.erase()` vymaže n-tý prvek a posune celý vektor. Potřebuje knihovnu `<algorithm>`
|
|
```cpp
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
|
|
int main() {
|
|
vector<char> v = {1, 2, 8, 4, 0};
|
|
|
|
v.pop_back(); //vymaže 0
|
|
v.erase(v.begin()); // vymaže 1
|
|
v.erase(find(v.begin(), v.end(), 8)); //najde a vymaže 8
|
|
|
|
|
|
for (int i = 0; i < v.size(); i++) {
|
|
cout << v[i] << " ";
|
|
} //zbyde 2,4
|
|
return 0;
|
|
}
|
|
```
|
|
# List
|
|
|
|
# Map
|
|
|
|
# Unordered_map |