[英]Why does array template iterator declaration requires specifying array size?
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()进行迭代,在数组迭代器模板中是否有提及大小的特殊原因?
当您使用带有不同模板参数的模板时,生成的类在任何意义上都不相同。 所以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
阐明了答案。
std::array
是一个具有固定优点的编译时固定大小的容器。 (对于运行时动态容器,您可以使用std::vector
)大小必须在编译时设置,因此, array<int>
是非法的,甚至不存在为类型。
对于传统数组(例如int a[123]
此类型是不错的选择。 与传统数组相比,您可以将std::array
传递给函数更容易,并且每当您使用std::array
您就知道长度。
函数.begin()
和.end()
使它与其他容器保持一致,您可以像其他STL类型一样对其进行迭代。 重要的是要知道array<int, 10>
和array<int, 11>
是具有相同接口的两种不同类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.