2012-11-27 13 views
7

Al momento sto avendo una scoreggia cerebrale e sto cercando un modo veloce per prendere un array e passare metà di esso a una funzione. Se avessi un array A di dieci elementi, in alcune lingue potrei passare qualcosa come A [5:] alla funzione ed essere fatto con esso. Esiste un costrutto simile in C++? Ovviamente mi piacerebbe evitare e una sorta di funzione di looping.C'è un modo in C++ per ottenere un sub-array da un array?

+6

Forse la tua funzione dovrebbe richiedere iteratori. – chris

+1

Non è possibile passare gli array alle funzioni in C++ poiché C++ non ha valori di array. Quindi, che cosa effettivamente prende la tua funzione? – melpomene

+0

Avrei un array int [] a = {1,2,3,4,5,6,7,8,9,10}. Sto quindi cercando un modo per ottenere un sub array int [] a1 = {6,7,8,9,10}. –

risposta

7

Sì. In C normale si usano puntatori, ma in C++ è possibile utilizzare qualsiasi tipo di iteratore (un puntatore può essere considerato un iteratore).

template<typename Iter> 
void func(Iter arr, size_t len) { ... } 

int main() { 
    int arr[10]; 
    func(arr, 10); // whole array 
    func(arr, 5);  // first five elements 
    func(arr + 5, 5); // last five elements 

    std::vector<Thing> vec = ...; 
    func(vec.begin(), vec.size());   // All elements 
    func(vec.begin(), 5);     // first five 
    func(vec.begin() + 5, vec.size() - 5); // all but first 5 

    return 0; 
} 

Il tipico trucco è quello di passare un puntatore al primo elemento della matrice, e quindi utilizzare un argomento separato per passare la lunghezza della matrice. Sfortunatamente non ci sono controlli sui limiti, quindi devi stare attento a farlo bene o scarabocchiare sulla tua memoria.

È inoltre possibile utilizzare intervalli semiaperti. Questo è il modo più comune per farlo. Molte funzioni nella libreria standard (come std::sort) funzionano in questo modo.

template<class Iter> 
void func(Iter start, Iter end) { ... } 

int main() { 
    int arr[10]; 
    func(arr, arr + 10);  // whole array 
    func(arr, arr + 5);  // first five elements 
    func(arr + 5, arr + 10); // last five elements 

    std::vector<Thing> vec = ...; 
    func(vec.begin(), vec.end());  // whole vector 
    func(vec.begin(), vec.begin() + 5); // first five elements 
    func(vec.begin() + 5, vec.end()); // all but the first five elements 

    return 0; 
} 

Ancora, nessun controllo di limiti.

+0

Penso che il template di cui stavi parlando sia: 'modello void func (const Iter e start, const Iter e end) {...}' – Corbin

+1

Solo 'template void func (Iter start, Iter end)' –

+0

se vuoi controllare i limiti usa l'accesso controllato-controllato, '& vec.at (5)', o 'vec.begin() + max (5, vec.size())' se '5' è in realtà 'al massimo 5' . – jthill

Problemi correlati