C++ 11inizializzazione uniforme su un vettore di vettori di interi
Il programma inizializza una vector
, denominata myVec
, di int
vector
s, e quindi utilizza un ciclo per stampare ciascuna interne vector
s' elementi . Ma ho avuto risultati inattesi quando ho cercato di vedere cosa succede quando uso bretelle extra. Quanto segue si trova anche su this LiveWorkSpace per passare facilmente da un compilatore all'altro. g++ 4.8.0
compila solo fino a myVec[5]
. clang++ 3.2
compila tutto:
#include <iostream>
#include <vector>
int main()
{
std::vector<std::vector<int>> myVec =
{
/* myVec[0] */ {1, 2},
/* myVec[1] */ {},
/* myVec[2] */ {{}},
/* myVec[3] */ { {}, {} },
/* myVec[4] */ { {}, {}, {} },
/* myVec[5] */ {{{}}}
/* myVec[6] */ // , { {{}}, {{}} } // g++ 4.8.0 COMPILER ERROR
/* myVec[7] */ // , {{{{}}}} // g++ 4.8.0 COMPILER ERROR
/* myVec[8] */ // , { {{{}}}, {{{}}} } // g++ 4.8.0 COMPILER ERROR
};
// loop for printing
for (unsigned int i = 0; i < myVec.size(); ++i)
{
std::cout << "myVec[" << i << "]: ";
for (unsigned int j = 0; j < myVec.at(i).size(); ++j)
{
std::cout << myVec.at(i).at(j) << ", ";
}
std::cout << std::endl;
}
return 0;
}
Actual g++ 4.8.0
uscita:
myVec[0]: 1, 2,
myVec[1]:
myVec[2]: 0,
myVec[3]: 0, 0,
myVec[4]: 0, 0, 0,
myVec[5]: 0,
Analisi:
myVec[0]
: {1, 2}
:
Ottenuto l'output previsto.
myVec[1]
: {}
:
Got previsto in uscita.
myVec[2]
: {{}}
:
Questo è un vettore della int
0
. Il rinforzo interno inizializza un int
a 0
.
myVec[3]
: { {}, {} }
:
Le due bretelle interne inizializza un int
ciascuno per 0
.
myVec[4]
: { {}, {}, {} }
:
I tre graffe interne inizializza un int
ciascuno per 0
.
myVec[5]
: {{{}}}
:
ho voluto aggiungere ancora un altro insieme di parentesi graffe per myVec[2]
per vedere quanto lontano posso andare con l'aggiunta di parentesi graffe prima di ottenere errori di compilazione. Non capisco perché compili e perché il suo elemento venga stampato come 0
.
Ad esempio, int j = {}
inizializza j
a 0
. vector<vector<int>> v = { {{}} }
inizializza lo {}
più interno a int
0
, rendendolo equivalente a vector<vector<int>> v = { {0} }
. Quindi, che cos'è vector<vector<int>> u = { {{{}}} }
e perché dovrebbe essere compilato?
L'ipotetico myVec[6]
: { {{}}, {{}} }
:
Seguendo lo stesso schema di cui sopra, ho voluto fare un vettore che contiene due serie di doppie parentesi graffe. Ma questo non si compila, e non capisco perché questo rompa lo schema di darmi zeri multipli.
l'ipotetico myVec[7]
: {{{{}}}}
:
ho voluto aggiungere ancora un altro insieme di parentesi graffe per myVec[5]
per vedere quanto lontano posso andare con l'aggiunta di parentesi graffe prima di ottenere errori di compilazione. Non capisco perché questo rompa lo schema e non si compili.
L'ipotetico myVec[8]
: { {{{}}}, {{{}}} }
:
ho voluto estendere myVec[7]
per fare un vettore con due serie di ganci tripli. Non capisco perché questo non viene compilato neanche.
Se tutto è uguale a myVec[5]
compila, perché non il resto?
Per il caso '{{}, {}}', pensiamo che gli inner '{}' sono inizializzatori per 'int's, dove viene chiamato il costruttore predefinito, dando loro un valore di' 0 '. Per quanto riguarda '{{{}}}', non ne ho idea. – Xymostech
[Con clang, ogni riga viene compilata, anche se con avvisi.] (Http://liveworkspace.org/code/2VasjA$0) – Mankarse
@Mankarse do [1] - [4] warn o solo [5] - [8]? –