Mi chiedevo quale di questi è il migliore quando passo un array come parametro?Array come parametro
void function(int arr[]) {...};
o
void function(int* arr) {...};
Potrebbe dirmi il motivo? e a quale libro potresti riferirti? Grazie!
Mi chiedevo quale di questi è il migliore quando passo un array come parametro?Array come parametro
void function(int arr[]) {...};
o
void function(int* arr) {...};
Potrebbe dirmi il motivo? e a quale libro potresti riferirti? Grazie!
Dal momento che questa questione è aggiunto c++, vorrei utilizzare nessuno dei due. Se si utilizza , entrambi sono equivalenti.
Ma dal momento che si utilizza C++, un approccio migliore è quello di utilizzare un std::vector
per questi compiti
void function(std::vector<int> &arr) {...}
o, se non si modifica la matrice/vettore
void function(const std::vector<int> &arr) {...}
Sono semanticamente identici.
# 1 è leggermente migliore (secondo me) perché rende esplicito il passaggio di una matrice.
Sono _syntactically_ different. Sono _ematicamente_equivalenti. –
E devo confessare che preferisco # 2, ma non perché rende esplicito il passaggio di un array; Lo preferisco perché rende esplicito che stai passando un ** indirizzo ** = P – WhozCraig
Il modo migliore per passare una matrice come parametro è in realtà:
void function(type_t* array, int amountOfElts, int arrayAllocatedElts);
In alcuni casi (come quando passano stringhe) spesso è possibile saltare questi due parametri. Ma possono essere utili in entrambi i casi, ad esempio quando si eseguono alcune operazioni sulla stringa, oppure possono salvarti una o due chiamate strlen.
L'utilizzo dell'opzione [] negli argomenti di funzione è a mio avviso confuso e dovrebbe essere evitato. Ma non penso sia una convenzione.
Se si desidera passare qualsiasi array (incluso l'allocazione dinamica), sono equivalenti.
caso la funzione richiede una matrice reale di dimensioni fisse, si potrebbe fare questo:
template <size_t N>
void function(char (&str)[N]) { ... }
Si chiede che scegliere di
void function(int arr[]) {...};
e
Quest'ultimo consente di dichiarare il puntatore stesso come const
, mentre il primo consente solo di dichiarare gli articoli come const
. Tuttavia, il lettore []
indica una matrice anziché un puntatore a un singolo oggetto. Personalmente ritengo che il vincolo offerto da const
sia praticamente più utile dell'indicazione di matrice offerta da []
.
Per il codice di livello superiore, utilizzare std::vector
o std::array
, a seconda di quale sia più appropriato.
A seconda del livello di astrazione che si desidera fornire, si dovrebbe scegliere tra Olaf di approccio o qualcosa STL utilizza per il grande livello:
template <class Iter>
void function(Iter first, Iter last)
{
// for example, to get size:
std::size_t size = std::distance(first, last);
// for example, to iterate:
for (Iter it = first; it != last; ++it)
{
// *it to get the value, like:
std::cout << *it << std::endl;
}
}
questo modo, è possibile utilizzare la funzione non solo per gli array, ma per vari tipi di STL: vettori, elenchi, code, pile e così via.
int tab[4] = {1,2,3,4};
function(tab, tab+4);
std::vector<int> vec;
// fill vector with something
function(vec.begin(), vec.end());
Quando si passa un array per il funzionamento decade come puntatore al primo elemento dell'array. Quindi entrambi sono identici. –
Di questi? 'void function (std :: string const & str) {...};' è il migliore. – Johnsyweb
Letture consigliate: http://stackoverflow.com/a/4810672/78845 – Johnsyweb