C++11
程序初始化 s 中的 a vector
, named myVec
,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
。内大括号初始化一个int
to 0
。
myVec[3]
: { {}, {} }
:
int
两个内大括号将each初始化为0
。
myVec[4]
: { {}, {}, {} }
:
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]
: { {{}}, {{}} }
:
按照与上面相同的模式,我想制作一个包含两组双花括号的向量。但这不能编译,我不明白为什么这会破坏给我多个零的模式。
假设的myVec[7]
: {{{{}}}}
:
我想再添加一组花括号,myVec[5]
看看在出现编译器错误之前添加花括号能走多远。我不明白为什么这会破坏模式并且无法编译。
假设的myVec[8]
: { {{{}}}, {{{}}} }
:
我想扩展myVec[7]
以制作带有两组三重括号的向量。我不明白为什么这也不能编译。
如果一切都可以myVec[5]
编译,为什么其余的不?