2012-06-15 18 views
15

C'è qualche problema con il mio codice?Posso spingere un array di int a un vettore C++?

std::vector<int[2]> weights; 
int weight[2] = {1,2}; 
weights.push_back(weight); 

Non può essere compilato, si prega di aiutare a spiegare perché:

no matching function for call to ‘std::vector<int [2], std::allocator<int [2]> >::push_back(int*&)’ 
+8

Questo potrebbe funzionare con un vettore di 'std :: array's,' std :: vector's, o 'std :: pair's. Il tuo array sta decadendo su un puntatore quando viene passato, causando problemi. – chris

+0

Grazie, chris. Lo capisco. – MrROY

+0

Penso che ci sia una buona risposta in attesa di venire fuori con tutte le specifiche del perché non funziona, che troverei una lettura interessante e illuminante. C'è di più che decadere, ma non sono sicuro di cosa ci sia. – chris

risposta

27

La ragione matrici non possono essere utilizzati in contenitori STL è perché richiede il tipo da copiare costruibile e programmabile (mouverà costruibile in C++ 11). Ad esempio, non è possibile effettuare le seguenti operazioni con le matrici:

int a[10]; 
int b[10]; 
a = b; // Will not work! 

Poiché gli array non soddisfano i requisiti, non possono essere utilizzati. Tuttavia, se si realmente bisogno di utilizzare un array (che probabilmente non è il caso), è possibile aggiungerlo come un membro di una classe in questo modo:

struct A { int weight[2];}; 
std::vector<A> v; 

Tuttavia, probabilmente sarebbe meglio se si utilizzato un std::vector o std::array.

4

non puoi fare che semplicemente.

E 'meglio si utilizza uno di questi:

  1. vector <vector<int>> (è fondamentalmente un due vector.It dimensionale dovrebbe funzionare nel tuo caso)

  2. vector<string> (stringa è un array di caratteri, in modo da hai bisogno di un cast di tipo più tardi. Può essere facilmente.).

  3. si può dichiarare una struttura (dicono S) avente array di int tipo in sé cioè

    struct S{int a[num]}, quindi dichiarare vettore vector< S>

Quindi indirettamente, si sta spingendo array in un vettore.

+1

Perché una stringa? La domanda riguarda coppie di 'int's. – huon

+0

Si usa la stringa? Y non vettore? –

+0

vettore di tipo stringa !! – vijay

0

Basta usare

vector<int*> .That will definitely work. 

Una discussione rilevante sullo stesso argomento: Pushing an array into a vector

+2

Si compilerà. Non penso che farà ciò che chiunque vorrebbe razionalmente fare! Se la matrice è in pila, la tua soluzione si bloccherà. –

+0

Potresti dirmi perché no? Ho appena provato un semplice esempio e ha funzionato come previsto. Il vettore memorizza solo l'indirizzo iniziale dell'array. Quindi, se vuoi accedere all'ennesimo elemento, cerca il vettore e vai all'ennesima posizione. – Arvind

+2

@Arvind: giusto. E tutto funziona finché l'array non lascia lo scope, o ti aspetti che fare una copia del 'vector' faccia una copia profonda. Poi cominciano a succedere cose strane. – Managu

4

array non sono copiare costruibile in modo non è possibile conservare in contenitori (vector in questo caso). È possibile memorizzare un nidificato vector o in C++ 11 a std::array.

+0

Sono i pesi 'std :: vector ;' e 'std :: vector pesi;' equivalente? – twsaef

+0

No, chiamano diversi tipi e l'array non si degrada al puntatore in quel punto. –

-2

Per istanziare il vettore, è necessario fornire un tipo, ma int [2] non è un tipo, è una dichiarazione.

+6

'int [2]' è un tipo. È un array di 2 interi. Anche gli array sono tipi, ma non così forte come in altre lingue. – chris

+0

Se fosse un tipo, la dichiarazione non sarebbe 'int [2] myvar;'? –

+2

@RogerDahl: Lo penseresti, ma no. Puoi creare template che accetterebbero 'int [2]' come tipo ([esempio] (http://ideone.com/1mzLP)), è solo che il tipo non soddisfa i requisiti di 'std :: VECTOR'. Quindi non può essere usato lì. –

4

Array può essere aggiunto al contenitore come questo.

int arr[] = {16,2,77,29}; 
    std::vector<int> myvec (arr, arr + sizeof(arr)/sizeof(int)); 

Spero che questo aiuti qualcuno.

Problemi correlati