|
|
|
![]() |
|
Strumenti |
![]() |
#21 | |
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Quote:
Se a inizio del codice metti "using namespace std;", sottintendi che vector lo deve cercare in std e l'anteposizione o meno di "std::" è ininfluente. Bender non lo ha specificato quindi è obbligato ad anteporre std::
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
![]() |
![]() |
![]() |
#22 |
Member
Iscritto dal: Mar 2008
Messaggi: 47
|
Vediamo di commentare passo passo:
Codice:
// Crea un vettore contenente numeri da 1 a max. std::vector<int> numbers(max); for (int i = 0; i < max; ++i) { numbers[i] = i + 1; } ![]() Quindi il vettore numbers contiene: Codice:
numbers[0] = 1; numbers[1] = 2; numbers[2] = 3; numbers[3] = 4; ... numbers[89] = 90; Gli algoritmi della libreria standard di norma prendono come parametri degli iteratori. Cosa sia un iteratore è un po' complesso, ma in sostanza è la generalizzazione di un puntatore ad un elemento di un array. Un iteratore "punta" ad un elemento di un contenitore. Incrementando l'iteratore si ottiene l'elemento successivo, decrementandolo si ottiene l'elemento precedente. Dereferenziandolo (con l'operatore *) si ottiene l'elemento puntato. Codice:
int array[4] = {1, 2, 3, 4}; int * inizio = & array[0]; // *inizio = 1 int * i = inizio; // *i = 1 i++; // *i = 2 int * fine = inizio + 4; // fine punta appena oltre la fine dell'array fine--; // *fine = 4 Codice:
std::vector<int> vettore = {1, 2, 3, 4}; // In realtà questa inizializzazione non è possibile, // ma assumi che contenga quegli elementi. std::vector<int>::iterator inizio = vettore.begin(); // *inizio = 1 std::vector<int>::iterator i = inizio; // *i = 1 i++; // *i = 2 std::vector<int>::iterator fine = inizio + 4; // fine punta appena oltre la fine del vettore fine--; // *fine = 4 Codice:
std::random_shuffle(numbers.begin(), numbers.end()); Codice:
std::vector<int> result(n); std::copy(numbers.begin(), numbers.begin() + n, result.begin()); Codice:
int vettore[10] = {...}; int result[3]; int * inizio_vettore = & vettore[0]; int * inizio_result = & result[0]; std::copy(inizio_vettore, inizio_vettore + 3, inizio_result) // Oppure int * i, *j; for (i = inizio_vettore, j = inizio_result; i != inizio_vettore + 3; ++i, ++j) { *j = *i; } L'ultimo blocco nel main() serve a stampare i risultati. Nota che uso const_iterator e non iterator perché non mi serve modificare gli elementi. std::vector è definito nell'header <vector> std::random_shuffle() e std::copy() sono definite nell'header <algorithm> std::cout è definito nell'header <iostream> std::srand() è definita nell'header <cstdlib> std::time() è definita nell'header <ctime> Quindi servono tutti gli header (anche se alcuni compilatori potrebbero essere poco severi nel caso ne manchi qualcuno). std::vector indica che il simbolo 'vector' (in questo caso una classe template) sta nel namespace 'std' (che è il namespace della libreria standard). I namespace permettono di avere simboli con lo stesso nome (ad esempio puoi scrivere la tua classe 'vector', purché sia definita in un namespace diverso). Usare "using namespace std;" non è considerata una buona pratica perché equivale a non usare namespace. In ogni caso non usarlo mai in un header, poiché si propagherebbe in tutti i file che lo includono. std::vector è una classe che rappresenta un vettore, così come std::list rappresenta una lista, std::stack una pila, std::queue una coda... In C++ non dovresti mai usare array C-style direttamente, queste classi li incapsulano offrendo un'interfaccia più sicura. |
![]() |
![]() |
![]() |
#23 | |
Senior Member
Iscritto dal: Feb 2011
Messaggi: 2013
|
Quote:
Approfitto per aggiungere un consiglio: Studiare per bene la Standard Template Library (STL) che aiuta veramente molto nello sviluppo dei programmi ! Magari in cose semplici si va a scrivere più codice, ma ne vale la pena perché sono affidabili e comode.
__________________
CPU: Intel i5 2500k; GPU: Asus GTX 970 ; Scheda audio: Asus Xonar U7; RAM: 16GB DDR3; Storage: HD 750GB+SSD Samsung 840 (128GB); OS: Arch Linux | Linux Mint 18 | Win 7 (gaming) Thread ufficiali ![]() Ultima modifica di IngMetallo : 19-07-2012 alle 21:08. |
|
![]() |
![]() |
![]() |
#24 |
Senior Member
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
|
Da dove stai imparando il C++? Probabilmente cambiare fonte di apprendimento potrebbe essere una buona idea, perchè questa domanda fa pensare che un libro diverso sarebbe meglio.
__________________
GPU Compiler Engineer Ultima modifica di AnonimoVeneziano : 20-07-2012 alle 01:30. |
![]() |
![]() |
![]() |
#25 |
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
AnonimoVeneziano eh già
![]() |
![]() |
![]() |
![]() |
#26 |
Senior Member
Iscritto dal: Feb 2011
Messaggi: 2013
|
Purtroppo in alcuni testi cose basilari come i namespace vengono trattate negli ultimi capitoli.. sul libro che ho io (Deitel&Deitel dell'Apogeo) vengono trattati addirittura nel secondo libro di "tecniche avanzate". La semplice soluzione in questi casi è cercare su internet quello che non si capisce e non accontentarsi mai di far funzionare un programma senza capirne il perché.
__________________
CPU: Intel i5 2500k; GPU: Asus GTX 970 ; Scheda audio: Asus Xonar U7; RAM: 16GB DDR3; Storage: HD 750GB+SSD Samsung 840 (128GB); OS: Arch Linux | Linux Mint 18 | Win 7 (gaming) Thread ufficiali ![]() |
![]() |
![]() |
![]() |
#27 | |
Junior Member
Iscritto dal: Jul 2012
Messaggi: 29
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:42.