C++11
このプログラムは、 のvector
namedmyVec
を初期化しint
vector
、ループを使用して各 innervector
の要素を出力します。しかし、追加の中括弧を使用するとどうなるかを確認しようとすると、予期しない結果が得られました。以下もこの LiveWorkSpaceにあり、コンパイラを簡単に切り替えることができます。g++ 4.8.0
までしかコンパイルできませんmyVec[5]
。clang++ 3.2
すべてをコンパイルします:
#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;
}
実際のg++ 4.8.0
出力:
myVec[0]: 1, 2,
myVec[1]:
myVec[2]: 0,
myVec[3]: 0, 0,
myVec[4]: 0, 0, 0,
myVec[5]: 0,
分析:
myVec[0]
: {1, 2}
:
期待どおりの出力が得られました。
myVec[1]
: {}
:
期待どおりの出力が得られました。
myVec[2]
: {{}}
:
これは のベクトルですint
0
。内側のブレースは to を初期化int
し0
ます。
myVec[3]
: { {}, {} }
:
2 つの内側の中括弧は、int
each を に初期化し0
ます。
myVec[4]
: { {}, {}, {} }
:
3 つの内側の中かっこは、int
each を に初期化し0
ます。
myVec[5]
: {{{}}}
:
myVec[2]
中括弧をさらに追加して、コンパイラ エラーが発生する前に中括弧をどこまで追加できるかを確認したかったのです。これがコンパイルされる理由と、その要素が として出力される理由がわかりません0
。
たとえば、 にint j = {}
初期化j
され0
ます。vector<vector<int>> v = { {{}} }
最も内側{}
をに初期化しint
0
、 と同等にしvector<vector<int>> v = { {0} }
ます。では、それは何でvector<vector<int>> u = { {{{}}} }
、なぜコンパイルされるのでしょうか?
仮説myVec[6]
: { {{}}, {{}} }
:
上記と同じパターンに従って、2 組の二重中括弧を含むベクターを作成したいと考えました。しかし、これはコンパイルされません。なぜこれが複数のゼロを与えるパターンを破るのか理解できません。
仮説myVec[7]
: {{{{}}}}
:
myVec[5]
中括弧をさらに追加して、コンパイラ エラーが発生する前に中括弧をどこまで追加できるかを確認したかったのです。これがパターンを壊してコンパイルしない理由がわかりません。
仮説myVec[8]
: { {{{}}}, {{{}}} }
:
myVec[7]
2 組の三重ブレースを使用してベクトルを作成するように拡張したかったのです。これがコンパイルされない理由もわかりません。
までのすべてがmyVec[5]
コンパイルされた場合、残りはなぜコンパイルされないのですか?