#include <iostream>
#include <fstream>
#include <string>
// STL tárolók
#include <vector>
#include <list>
// STL iterátor
#include <iterator>
// STL algoritmus
#include <algorithm>
#include <numeric>
using namespace std;
// Double számot kiíró függvény
void Kiir(double d) { cout << d << endl; }
// Fahreinheit-be átszámoló hagyományos függvény
void CtoF(double& t) { t = t * 9 / 5 + 32; }
// Celsius-ba átszámoló fgv. objektum
class FtoC {
public:
// operátor ()-t kell elkészíteni!
void operator()(double& t) { t = (t -32) * 5 / 9; }
};
class Szemely {
private:
string vnev, knev;
list<string> tel;
public:
Szemely(string vnev, string knev, string t = "") : vnev(vnev), knev(knev) {
if (t != "") tel.push_back(t);
}
string getvnev() const { return vnev; }
string getknev() const { return knev; }
void setvnev(string s) { vnev = s; }
void setknev(string s) { knev = s; }
void kiir(bool knevszerint = false) {
if(knevszerint) cout << knev << ", " << vnev << " ";
else cout << vnev << " " << knev << " ";
copy(tel.begin(), tel.end(), ostream_iterator<string>(cout, " | "));
cout << endl;
}
void addTel(string t) {
tel.push_back(t);
tel.sort();
}
bool operator==(const Szemely& b) { // find művelethez
return vnev == b.vnev && knev == b.knev;
}
bool operator<(const Szemely & b) { // sort művelethez
return vnev < b.vnev;
}
};
int main()
{
vector<double> adatok; // vektor adatok számára / nincs megadva a kezdőmérete
ifstream fbe("adatok.txt"); // soronként számokat tartalmazó szövegfájl
if (!fbe.is_open())
{
cout << "Nincs meg az adatok.txt fajl!";
return -1;
}
while (!fbe.eof()) {
string sor;
getline(fbe, sor);
if (sor.empty()) continue;
adatok.push_back(stod(sor)); // adat vektor végéhez adása
}
fbe.close();
vector<double>::iterator it; // iterátor a vektor bejárásához
for (it = adatok.begin(); it != end(adatok); it++) // az elejétőõl a végéig
cout << *it << endl; // *it az iterátor által mutatott adat
//it = min(adatok.begin(), adatok.end()); // ez csak két elemet hasonlít össze pl. min(10,42)
//cout << "Min:" << *it << endl;
it = min_element(begin(adatok), end(adatok)); // tartományban szereplő adatokra min_element kell
cout << "Min:" << *it << endl;
it = max_element(begin(adatok), end(adatok));
cout << "Max:" << *it << endl;
// algoritmusok testre szabása, fgv. pointerrel, fgv. objektummal, vagy lambda kifejezéssel
for_each(adatok.begin(), adatok.end(), CtoF ); // fgv. pointerrel
for_each(adatok.begin(), adatok.end(), Kiir ); // nem kell a zárójel!
for_each(adatok.begin(), adatok.end(), FtoC()); // fgv. objektum, kell a () operátor
for_each(adatok.begin(), adatok.end(), Kiir);
double szum = 0; // külső változó az összeg tárolására
for_each(begin(adatok), end(adatok),
[&szum](double d) { szum += d; }); // lambda kifejezés használta, &szum átadása, mert külső és megváltoztatható
cout << "Az osszeg: " << szum << endl;
szum = accumulate(adatok.begin(), adatok.end(), 0.0); // összegző algoritmus bemutatása
cout << "Az osszeg: " << szum << endl;
// Tároló elemeszámának és kapacításáanak bemutatása
cout << "Elemszam: " << adatok.size() << " Kapacitas: " << adatok.capacity() << endl;
adatok.push_back(12); // plusz elemek hozzáadása ...
adatok.push_back(12); // ha kinövi a kapacitást, akkor elköltözik
cout << "Elemszam: " << adatok.size() << " Kapacitas: " << adatok.capacity() << endl;
// elemek rendezése, nincs sort tagfüggvénye a vectornak, de van sort algoritmus
sort(adatok.begin(), adatok.end());
for_each(adatok.begin(), adatok.end(), Kiir );
// rendezés csökkenő sorrendbe beépített functional használatával
sort(adatok.begin(), adatok.end(), greater<double>());
for_each(adatok.begin(), adatok.end(), Kiir);
// Személy létrehozása és plusz telefonszám hozzáadása
Szemely szemely("Kiss", "Istvan", "06/70 568-4589");
szemely.addTel("06/70 478-7857");
// Telefonkönyv
list<Szemely> szemelyek;
szemelyek.push_back(szemely);
szemelyek.push_back(Szemely("Nagy", "Bianka", "06/30 457-4789"));
szemelyek.back().addTel("06/20 478-7894"); // az utolsó elem referenciáját adja vissza a back()
szemelyek.emplace_back("Meszaros", "Gabor", "06/20 478-6912"); // példányosítás + hozzáadás
szemelyek.insert(next(szemelyek.begin(),1), // beszúrás az első után, next() léptet
Szemely("Kovacs", "Kata", "06/20 145-4789"));
// szemely keresése a listában
list<Szemely>::iterator szit;
szemely = Szemely("Kovacs", "Kata");
szit = find(szemelyek.begin(), szemelyek.end(), szemely); // szemely megkeresése == operátor alapján
if (szit != szemelyek.end()) // ha megtalálta
szit->addTel("06/70 457-7895");
// szemely keresése név alapján
string vnev = "Meszaros", knev = "Gabor";
szit = find_if(szemelyek.begin(), szemelyek.end(),
[vnev, knev](const Szemely& sz)->bool {return sz.getvnev() == vnev && sz.getknev() == knev; });
if (szit != szemelyek.end()) // ha megtalálta
szit->addTel("06/70 237-1452");
cout << "\nTelefonkonyv:" << endl;
// sorba rendezés a < operátor alapján
szemelyek.sort();
for (szit = szemelyek.begin(); szit != szemelyek.end(); szit++)
szit->kiir();
cout << "\nKeresztnev szerint:" << endl;
// sorba rendezés lambda kifejezés alapján, keresztnév szerint
szemelyek.sort(
[](const Szemely& a, const Szemely& b)->bool { return a.getknev() < b.getknev(); });
for (szit = szemelyek.begin(); szit != szemelyek.end(); szit++)
szit->kiir(true);
// átalakítás
vector<string> nevek(szemelyek.size());
transform(szemelyek.begin(), szemelyek.end(), nevek.begin(),
[](const Szemely& a)->string { return a.getvnev() + " " + a.getknev(); });
sort(nevek.begin(), nevek.end());
cout << "\nNevek:" << endl;
for (auto nev : nevek) cout << nev << endl;
}