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

时间:2013-11-12 20:01:58

标签: c++ c++11 iterator

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()在数组迭代器模板中有没有提到大小的特殊原因?

2 个答案:

答案 0 :(得分:2)

当您使用具有不同模板参数的模板时,生成的类在任何意义上都不相同。因此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澄清答案。

答案 1 :(得分:2)

std::array编译时固定大小容器,它有其优点。 (对于运行时动态容器,您可以使用std::vector)必须在编译时设置大小,因此array<int>是非法的,甚至不存在作为类型。

此类型是int a[123]等传统数组的理想替代品。您可以比传统数组更轻松地将std::array传递给函数,无论何时使用std::array,您都知道长度。

函数.begin().end()使其与其他容器保持一致,您可以像其他STL类型一样迭代它。重要的是要知道array<int, 10>array<int, 11>是两种具有相同接口的不同类型。