Harjutusülesanded
1. Andmekogumid hulkadena
Koosta järgmised mallifunktsioonid andmekogumitega opereerimiseks. Funktsioonid peavad töötama andmekogumite vector
, list
ja deque
korral. Vajadusel teha funktsioone juurde.
NB! Mitte kasutada päist <set>
!
- hulkade ühisosa
template <typename T1, typename T2, typename T3> void yhisosa(T1& esimene, T2& teine, T3& kolmas)
- hulkade ühend
template <typename T1, typename T2, typename T3> void yhend(T1& esimene, T2& teine, T3& kolmas)
- hulkade vahe
template <typename T1, typename T2, typename T3> void vahe(T1& esimene, T2& teine, T3& kolmas)
Näited funktsioonide rakendamisest andmekogumitel
vector<int> v1{10, 11, 5, 3, 3}; vector<int> v2{3, 5, 3, 5, 1}; vector<int> v3{}; tryki(v1, cout); // kuvab elemendid ekraanile tryki(v2, cout); yhisosa(v1, v2, v3); cout << "v1 ja v2 ühisosa:\n"; tryki(v3, cout); v3.clear(); yhend(v1, v2, v3); cout << "v1 ja v2 ühend:\n"; tryki(v3, cout); v3.clear(); vahe(v1, v2, v3); cout << "v1 ja v2 vahe:\n"; tryki(v3, cout); | 10 11 5 3 3 3 5 3 5 1 v1 ja v2 ühisosa: 5 3 v1 ja v2 ühend: 10 11 5 3 1 v1 ja v2 vahe: 10 11 |
2. Funktsioonide tööaja võrdlemine
Koosta järgmised mallifunktsioonid suurte andmekogumite töö võrdlemiseks. Kõik andmekogumid hoiavad täisarve.
- andmekogumi täitmine
template <typename T> void täida(T& andmed, int n);
Funktsioon peab täitma etteantud andmekogumi (vector
, deque
või list
) järjestikuste täisarvudega (alates nullist). Funktsioon peab töötama kolme nimetatud andmekogumi korral.
- Summa leidmine
1. Summa leidmine indeksi abil, kus elemendid saadakse kätte operaatori []
abil.
template <typename T> int summa1(T& andmed);
Funktsioon peab töötama vector
ja deque
korral.
2. Summa leidmine iteraatori abil. Andmekogum läbitakse iteraatori abil.
template <typename T> int summa2(T& andmed);
Funktsioon peab töötama vector
, deque
ja list
korral.
Võrrelge summa leidmise aega mõlema funktsiooni abil ja erinevate andmekogumite korral. Valige sobiv elementide arv (> 1e5).
Aja mõõtmiseks saab kasutada päises <chrono>
olevat funktsiooni now()
, mis annab hetke aja:
auto algus = chrono::high_resolution_clock::now(); auto lõpp = chrono::high_resolution_clock::now(); auto aeg = chrono::duration_cast<std::chrono::nanoseconds>(lõpp - algus);
Tuleb silmas pidada, et tulemus on nanosekundites, st on mõistlik teisendada sekunditeks. Põhjendage saadud tulemusi.