array<int,4> a1 = {1,2,3,4};
array<int,4>::iterator itr1 = a1.begin(); //Ok
array<int>::iterator itr2 = a1.begin(); //Compiler error. why not allowed?
//Iteration
while(itr1 != a1.end())
{
cout<<"\n "<<*itr1;
itr1++;
}
因为我们总是从begin()迭代到end()在数组迭代器模板中有没有提到大小的特殊原因?
答案 0 :(得分:2)
当您使用具有不同模板参数的模板时,生成的类在任何意义上都不相同。因此std::array<int, 1>
和std::array<int, 2
的类型不同。当您实例化模板时,会创建该类的专用副本,因此上面的示例创建了两个不同的std::array
特化项,其中一个参数<int, 1>
,另一个参数<int, 2>
。即使专业化具有非常相似的实现,它们也不尽相同。因此std::array<int, 1>::iterator
与std::array<int, 2>::iterator
的类型不同。它们是两种不同的专业。
std::array<int>
的尝试,乍一看似乎很合理,但是不正确,因为std::array
需要两个模板参数,而不是一个。 auto
关键字的引入部分是为了让这些事情更容易使用。
PS:感谢aaronman
澄清答案。
答案 1 :(得分:2)
std::array
是编译时固定大小容器,它有其优点。 (对于运行时动态容器,您可以使用std::vector
)必须在编译时设置大小,因此array<int>
是非法的,甚至不存在作为类型。
此类型是int a[123]
等传统数组的理想替代品。您可以比传统数组更轻松地将std::array
传递给函数,无论何时使用std::array
,您都知道长度。
函数.begin()
和.end()
使其与其他容器保持一致,您可以像其他STL类型一样迭代它。重要的是要知道array<int, 10>
和array<int, 11>
是两种具有相同接口的不同类型。