这两个声明之间有什么区别?
int myints[5];
array<int,5> myints;
如果我使用第一个声明和函数size(),则会出现错误“成员引用基类型'int [5]'不是结构或联合”。 但是如果我使用第二个声明和函数size(),程序就可以工作。 为什么第一个声明不起作用?
#include <iostream>
#include <iomanip>
#include <array>
using namespace std;
int main()
{
//int myints[5]; //illegal
array<int,5> myints; //legal
cout << "size of myints: " << myints.size() << endl; //Error if I use the first declarations
cout << "sizeof(myints): " << sizeof(myints) << endl;
}
答案 0 :(得分:3)
正如其他人所指出的那样,std::array
是一个扩展名
到C ++ 11(所以你可能没有它),它包装了一个C风格的数组,
为了给它一些(但不是全部)类似STL的接口。
目标是它可以在任何C风格的数组中使用
可以;特别是,它接受相同的初始化语法
作为C样式数组,如果初始化类型允许静态
初始化时,它的初始化也可以是静态的。 (上
另一方面,编译器无法从中推断出它的大小
初始化列表的长度,它可以用于较旧的
C样式数组。)
关于尺寸,任何有经验的程序员都会有
工具箱中的大小函数,与...相同
std::begin
和std::end
(这是C ++ 11扩展,和
在C ++ 11标准化之前,每个人都有他们的工具包
他们)。类似的东西:
template <typename T>
size_t
size( T const& c )
{
return c.size();
}
template <typename T, size_t n>
size_t
size( T (&a)[n] )
{
return n;
}
(在现代C ++中,第二个甚至可能是constexpr
。)
鉴于此,无论是否,都写size( myInts )
是std::array
或C样式数组。
答案 1 :(得分:1)
array<int,5> myints
使用std::array
,这是一个模板,它覆盖了“基本”C / C ++数组(这是int myints[5]
)的增强功能。使用基本数组,您只需保留一大块存储空间,并自行负责跟踪其大小(尽管您可以使用sizeof()
来帮助解决此问题。)
使用std::array
,您可以获得帮助函数,使数组更安全,更易于使用。
答案 2 :(得分:1)
std::array
是C ++ 11中的新功能。如您所见,它具有size
功能。这会告诉您数组中有多少项。
另一方面,sizeof
告诉你变量占用多少内存,即以字节为单位的大小。
答案 3 :(得分:0)
array是一个模板类,它的size()是它的成员函数,而int []是简单的C数组
答案 4 :(得分:0)
通过使用int myints[5];
,您将在堆栈上声明一个包含5个int的数组,这是基本的C数组。
相反,通过使用array<int,5> myints;
,您声明了一个array
类型的对象,它是由STL(http://en.cppreference.com/w/cpp/container/array)定义的容器类,后者又实现{{1}用于检索容器大小的函数。
STL容器构建在“基本”C类型之上,以提供额外的功能并使其更易于管理。
答案 5 :(得分:0)
int myints[5];
没有功能size()
,但您可以
int size = sizeof(myints)/ sizeof(int);
获取数组的大小。
基本上你可以做到:
#include <iostream>
#include <iomanip>
#include <array>
using namespace std;
int main()
{
int myintsArr[5]; //legal
array<int,5> myints; //legal
cout << "size of myints: " << myints.size() << endl; //Error if I use the first declarations
cout << "sizeof(myintsArr): " << sizeof(myintsArr)/ sizeof(int) << endl;
}
并从两个数组中获得相同的结果