2013-06-07 10 views
11

Sto usando vector in un programma C++ (e sono un principiante).
E devo inviare una parte di vector a una funzione.Possiamo inviare parte del vettore come argomento di funzione?

Se fosse c ho bisogno di fare questo (con array):

int arr[5] = {1, 2, 3, 4, 5}; 
func(arr+2); //to send part array {3, 4, 5} 

C'è un modo diverso da creare una nuova vector con ultima parte?

+2

"* Se fosse c, ho bisogno di fare questo (con gli array): *" Questo presuppone che 'func' sapesse che è necessario un array di 3 elementi (o meno). Se si aspetta un array di 5, sei fregato. –

+0

È possibile che tu stia facendo qualcos'altro interamente. Perché stai passando i dati grezzi? Cosa rappresenta il vettore? Vorrei incapsularlo ed eseguire operazioni su di esso, invece di passarlo altrove. –

risposta

20

Un approccio comune è quello di superare gli intervalli iteratori. Questo funziona con tutti i tipi di intervallo, compresi quelli appartenenti a contenitori della libreria standard e matrici semplici:

template <typename Iterator> 
void func(Iterator start, Iterator end) 
{ 
    for (Iterator it = start; it !=end; ++it) 
    { 
    // do something 
    } 
} 

poi

std::vector<int> v = ...; 
func(v.begin()+2, v.end()); 

int arr[5] = {1, 2, 3, 4, 5}; 
func(arr+2, arr+5); 

Nota: Sebbene la funzione funziona per tutti i tipi di catene, non tutti i tipi di iteratore supportano l'incremento tramite operator+ utilizzato in v.begin()+2. Per le alternative, dare un'occhiata a std::advance e std::next.

+3

Lo direi più in generale: la funzione funziona per tutti gli ** intervalli **. I contenitori e gli array sono un modo per gestire gli intervalli, ma non sono l'unico modo. –

+0

@PeteBecker Buon punto. Modificato. – juanchopanza

1
std::vector<char> b(100); 
send(z,&b[0],b.size(),0); 

Prova questo.

Read this too.

+0

Vuoi dire "& b [2]", vero? –

+0

Leggi anche la mia risposta aggiornata. –

+0

Questo funziona perfettamente per i vettori, poiché sono contigui. http: // StackOverflow.com/domande/849.168/sono-stdvector-elementi-garantito-to-be-contigua. Basta fare attenzione a non provare questo tipo di cose con contenitori di memoria non contigui. – kmort

6

In genere è possibile inviare iteratori.

static const int n[] = {1,2,3,4,5}; 
vector <int> vec; 
copy (n, n + (sizeof (n)/sizeof (n[0])), back_inserter (vec)); 

vector <int>::iterator itStart = vec.begin(); 
++itStart; // points to `2` 
vector <int>::iterator itEnd = itStart; 
advance (itEnd,2); // points to 4 

func (itStart, itEnd); 

Questo funziona con più di un semplice vector s. Tuttavia, dal momento che un vector ha garantito lo stoccaggio contigious, a condizione che il vector non riallocata è possibile inviare gli indirizzi di elementi:

func (&vec[1], &vec[3]); 
0

Come altri già detto è possibile utilizzare iteratori per questo. Dovrai passare l'inizio della sequenza e la fine della sequenza alla funzione del tuo lavoratore.

Se è necessaria maggiore flessibilità, è necessario dare un'occhiata a slice. Con slice è possibile ad esempio recuperare ogni n-esima entrata del vettore.

0

Sono stato anche attaccato alla stessa problem.I trovato uno veramente bello trick.Suppose si desidera trovare il minimo nella gamma L-R (entrambi inclusi) di arr allora si può fare qualcosa di simile:

vector<int>arr = {4,5,1,3,7}; 

int minVal = *min_element(begin(arr)+L,begin(arr)+(R+1)); 

Significa che si passa la matrice e l'intervallo completi e quindi è possibile applicare il trucco precedente.

Problemi correlati