C++ 11Düzgün başlatma
programı int
vector
s, myVec
adlı bir vector
başlatır, ve daha sonra her bir iç vector
sitesindeki elemanları yazdırmak için bir döngü kullanır . Fakat ekstra kıvırcık parantez kullandığımda ne olduğunu görmeye çalışırken beklenmedik sonuçlar elde ettim. Derleyiciler arasında kolay geçiş için aşağıdaki this LiveWorkSpace da bulunmaktadır. g++ 4.8.0
yalnızca myVec[5]
'a kadar derler. clang++ 3.2
derler herşey:
#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;
}
Fiili g++ 4.8.0
çıkışı:
myVec[0]: 1, 2,
myVec[1]:
myVec[2]: 0,
myVec[3]: 0, 0,
myVec[4]: 0, 0, 0,
myVec[5]: 0,
Analiz:
myVec[0]
: {1, 2}
:
Beklediğiniz çıktı var.
myVec[1]
: {}
:
çıkış bekleniyor var.
myVec[2]
: {{}}
:
Bu int
0
bir vektördür. İç destek, int
'u 0
'a başlatır.
myVec[3]
: { {}, {} }
:
iki iç parantez 0
bir int
her başlatır.
myVec[4]
: { {}, {}, {} }
:
üç iç parantez 0
bir int
her başlatır.
myVec[5]
: {{{}}}
:
Ben derleyici hatalarını almadan önce parantez ekleyerek ne kadar ileri gidebileceğimizi görmek myVec[2]
henüz küme parantezleri başka bir set eklemek istedim. Bunun neden derlendiğini ve elemanının neden 0
olarak yazdırıldığını anlamıyorum.
Örneğin, int j = {}
0
için j
başlatır. vector<vector<int>> v = { {{}} }
, en {}
değerini int
0
için vector<vector<int>> v = { {0} }
eşdeğerine dönüştürür. O zaman, vector<vector<int>> u = { {{{}}} }
nedir ve neden derlenmelidir?
Varsayımsal myVec[6]
: { {{}}, {{}} }
: Yukarıdaki aynı desen ardından
, ben çift küme parantezleri iki set içeren bir vektör yapmak istedi. Ama bu bir derleme yapmıyor, ve neden bunun bana birden fazla sıfır veren modelini kırdığını anlamıyorum.
Varsayımsal myVec[7]
: {{{{}}}}
:
Ben derleyici hatalarını almadan önce parantez ekleyerek ne kadar ileri gidebileceğimizi görmek myVec[5]
henüz küme parantezleri başka bir set eklemek istedim. Bunun neden desen kırdığını ve neden derlenmediğini anlamıyorum.
Varsayımsal myVec[8]
: { {{{}}}, {{{}}} }
:
Üçlü parantez iki takım ile bir vektör yapmaya myVec[7]
uzatmak istedi. Bunun neden böyle olmadığını anlamıyorum.
myVec[5]
derlerken için her şey, neden gerisini Değilse?
'{{}, {}}' durumda, onları '0 değerini vererek varsayılan yapıcı olarak adlandırılır' int's içindir, bu başlatıcıları I '} {' iç düşünmek '. '{{{}}}' Ile ilgili olarak, hiçbir fikrim yok. – Xymostech
[. Clang ile her hat uyarılar ile de olsa, derler] (http://liveworkspace.org/code/2VasjA$0) – Mankarse
yapmak @Mankarse [1] - [4] uyarmak veya [5] - [8]? –