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

4

2 回答 2

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澄清答案。

于 2013-11-12T20:04:27.093 回答
2

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

这种类型是传统数组(例如int a[123]. 您可以std::array比传统数组更容易地传递给函数,并且无论何时使用std::array您都知道长度。

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

于 2013-11-12T20:05:56.330 回答