Guest User

Untitled

a guest
Feb 20th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.69 KB | None | 0 0
  1. #include<iostream>
  2. #include<algorithm>
  3. #include<typeinfo>
  4.  
  5. using namespace std;
  6.  
  7. main(){
  8. vector<string> titolo;
  9. vector<string> artista;
  10. titolo.push_back("blood");
  11. titolo.push_back("sugar");
  12. titolo.push_back("sex");
  13. titolo.push_back("magik");
  14. for(string s : titolo) cout << s << ' ';
  15. /* for_each loop: costrutto del c++11 che itera titolo assegnando ad s ogni oggetto-stringa contenuto in titolo: molto utile per iterazioni "al volo" */
  16. //stampa blood sugar sex magik
  17. cout << endl;
  18. artista.push_back("red");
  19. artista.push_back("hot");
  20. artista.push_back("chili");
  21. artista.push_back("peppers");
  22. for(string s : artista) cout << s << ' ';
  23. //stampa red hot chili peppers
  24. cout << endl;
  25. for_each(artista.begin(), artista.end(), [&titolo](string s){
  26. titolo.push_back(s);
  27. });
  28. /* for_each(container.begin(), container.end(), FunzioneUnaria);
  29. FunzioneUnaria(T t) viene invocata passando come parametro attuale l'iteratore dereferenziato, da container.begin() (compreso) a container.end() (escluso).
  30. Se FunzioneUnaria e' una funzione il cui scope e' raggiungibile dal blocco contenente l'istruzione di for_each, allora viene passato come parametro attuale a tale funzione un iteratore dereferenziato di questo intervallo: [container.begin(), container.end()).
  31. Se FunzioneUnaria e' una lambda espressione, allora il suo parametro formale sara' necessariamente un parametro dello stesso tipo contenuto in container: il parametro attuale cosi' ottenuto assumera' un valore diverso ad ogni iterazione, come succede nel caso precedente.
  32. artista quindi non compare nella capture list perche' gli oggetti che contiene sono rappresentati coerentemente col parametro formale ad ogni iterazione.
  33. */
  34. for(string s : titolo) cout << s << ' ';
  35. cout << endl;
  36. cout << "totale: " << ([&titolo]()throw()->int{
  37. int a = 0;
  38. for(auto it=titolo.begin(); it!=titolo.end(); ++it) ++a;
  39. return a;
  40. })() << " parole\n";
  41. /* la lambda espressione precedente non aveva tipo di ritorno (void), questa invece ha come tipo di ritorno un funtore. Un funtore, sostanzialmente, e' un oggetto che puo' essere invocato come se fosse una funzione: e' proprio quello che succede qui.
  42. Una scrittura equivalente sarebbe potuta essere questa:
  43. auto a = [&titolo]()throw()->int{
  44. int e = 0;
  45. for(auto it=titolo.begin(); it!=titolo.end(); ++it) ++e;
  46. return e;
  47. };
  48. cout << "totale: " << a() << " parole.\n";
  49. viene catturato titolo per riferimento, viene specificato che non possono essere sollevate eccezioni all'interno del corpo della lambda espressione, la lista parametri e' vuota ed il tipo di ritorno del funtore e' int. La lista parametri deve necessariamente essere scritta se si vuole specificare il tipo di ritorno.
  50. */
  51. }
Add Comment
Please, Sign In to add comment