繁体   English   中英

为什么数组模板迭代器声明需要指定数组大小?

[英]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>::iteratorstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM