Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:jimp2:2017:labs:operatory [2017/04/10 14:46] mwp [Ćwiczenia] |
pl:dydaktyka:jimp2:2017:labs:operatory [2018/04/10 11:58] mwp [Ćwiczenia] |
- [1 plus] co należy zrobić z powyższym operatorem, żeby była możliwa operacja <code cpp>repository["201500022324"].ChangeFirstName("Ziemowit");</code> i została zmienione imię studenta już w repozytorium. | - [1 plus] co należy zrobić z powyższym operatorem, żeby była możliwa operacja <code cpp>repository["201500022324"].ChangeFirstName("Ziemowit");</code> i została zmienione imię studenta już w repozytorium. |
- [1 plus] dopisz operator rzutowania dla StudyYear do typu int. | - [1 plus] dopisz operator rzutowania dla StudyYear do typu int. |
- [2 plusy] Zdefiniować strukturę Zipper ze statyczną metodą zip(std::vector<std::string>, std::vector<int>), która pozwoli na uruchomienie następującego kodu: <code cpp>int foo(const vector<string> &v1, const vector<int> &v2) { | - [2 plusy] Zdefiniować klasę Zipper ze statyczną metodą zip(std::vector<std::string>, std::vector<int>), która pozwoli na uruchomienie następującego kodu: <code cpp>int foo(const vector<string> &v1, const vector<int> &v2) { |
for (const pair<string,int> &p : Zipper::zip(v1,v2)) { | for (const pair<string,int> &p : Zipper::zip(v1,v2)) { |
if (p.first == "elo") { | if (p.first == "elo") { |
} | } |
return 0; | return 0; |
| }</code> Podpowiedź: udostępniona też [[http://coliru.stacked-crooked.com/a/ff24fd32a47a6e18|TU]] <code cpp>#include <iostream> |
| #include <string> |
| #include <vector> |
| #include <utility> |
| |
| using std::cout; |
| using std::endl; |
| using std::vector; |
| using std::string; |
| using std::pair; |
| using std::literals::string_literals::operator""s; |
| |
| |
| class ZipperIterator { |
| public: |
| pair<string,int> operator*() const; //wmagane w linii 74 |
| ZipperIterator &operator++(); //wymagane w linii 73 for(_;_;TU) |
| bool operator!=(const ZipperIterator &other) const; //wymagane w linii 73 for(_;TU;_) |
| private: |
| //TODO |
| }; |
| |
| //umożliwia przeglądanie dwóch wektorów na raz, w jednej pętli range-for |
| class Zipper { |
| public: |
| static Zipper zip(const vector<string> &vs, const vector<int> &vi); |
| |
| ZipperIterator begin(); //wymagane w linii 73 for(TU;_;_) |
| ZipperIterator end(); //wymagane w linii 73 for(_;TU;_) |
| private: |
| //TODO |
| }; |
| |
| |
| |
| int main() |
| { |
| vector<int> vi = {1,2,3}; |
| vector<string> vs = {"one"s,"two"s,"three"s}; |
| |
| //PROSTY przykład |
| for (const auto i : vi) { |
| cout << i; |
| } |
| cout << endl; |
| //to samo bez auto: |
| for (const int i : vi) { |
| cout << i; |
| } |
| cout << endl; |
| //przetłumaczony powyższa petla mniej wiecej tak jak to kompilator |
| //rozumie: |
| for (vector<int>::iterator it = vi.begin(); it != vi.end(); ++it) { |
| const int i = *it; |
| cout << i; |
| } |
| cout << endl; |
| |
| //Przykład z zipperem |
| for (const auto &p : Zipper::zip(vs,vi)) { |
| cout << p.second << " is " << p.first; |
| } |
| cout << endl; |
| //to samo bez auto: |
| for (const pair<string,int> &p : Zipper::zip(vs,vi)) { |
| cout << p.second << " is " << p.first; |
| } |
| cout << endl; |
| |
| //przetłumaczony powyższa petla mniej wiecej tak jak to kompilator |
| //rozumie: |
| Zipper tmp = Zipper::zip(vs,vi); |
| for (ZipperIterator it = tmp.begin(); it != tmp.end(); ++it) { |
| const pair<string,int> &p = *it; |
| cout << p.second << " is " << p.first; |
| } |
| cout << endl; |
}</code> | }</code> |
| |