C++ 在C++;在Xcode下

C++ 在C++;在Xcode下,c++,arrays,declaration,C++,Arrays,Declaration,这两种声明之间有什么区别 int myints[5]; array<int,5> myints; int myints[5]; 数组myints; 如果使用第一个声明和函数size(),将出现错误“成员引用基类型'int[5]'不是结构或联合”。 但是如果我使用第二个声明和函数size(),程序就会工作。 为什么最初的声明不起作用 #include <iostream> #include <iomanip> #include <array>

这两种声明之间有什么区别

int myints[5];

array<int,5> myints;
int myints[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;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
//int myints[5];//非法
数组myints;//合法
cout
数组myints
使用
std::array
,这是一个模板,它将增强的功能覆盖在“基本”C/C++数组(这就是
int myints[5]
的内容)之上。使用基本数组,您只需保留一块存储空间,并负责自己跟踪其大小(尽管您可以使用
sizeof()
来帮助进行此操作)

使用
std::array
可以获得帮助函数,使数组更安全、更易于使用。

array myints
使用
std::array
,该模板将增强的功能覆盖在“基本”C/C++数组之上(这就是
int myints[5]
的功能)。对于基本阵列,您只需保留一块存储空间,并负责自己跟踪其大小(尽管您可以使用
sizeof()
来帮助)


使用
std::array
可以获得帮助函数,使数组更安全、更易于使用。

array是一个模板类,它的成员函数是size(),而int[]是简单的C array

array是一个模板类,它的成员函数是size(),而int[]is simple C array

std::array
在C++11中是新的。正如您所发现的,它有一个
size
函数。它告诉您数组中有多少项。

另一方面,
sizeof
告诉您一个变量占用了多少内存,即它的大小(以字节为单位)。
std::array
在C++11中是新的。正如您所发现的,它有一个
size
函数。它告诉您数组中有多少项。

另一方面,
sizeof
告诉您一个变量占用了多少内存,即它的大小(以字节为单位)。

通过使用
int myints[5];
,您在堆栈上声明了一个包含5个int的数组,这是基本的C数组

相反,通过使用
array myints;
可以声明类型为
array
的对象,该对象是STL()定义的容器类,STL()反过来实现
size()
函数来检索容器的大小


STL容器构建在“基本”C类型之上,以提供额外的功能并使其更易于管理。

通过使用
int-myints[5];
,您在堆栈上声明了一个包含5个int的数组,即基本C数组

相反,通过使用
array myints;
可以声明类型为
array
的对象,该对象是STL()定义的容器类,STL()反过来实现
size()
函数来检索容器的大小


STL容器构建在“基本”C类型之上,以提供额外的功能并使其更易于管理。

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;

}
#包括
#包括
#包括
使用名称空间std;
int main()
{
int myintsArr[5];//合法
数组myints;//合法

cout
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;

}
#包括
#包括
#包括
使用名称空间std;
int main()
{
int myintsArr[5];//合法
数组myints;//合法

正如其他人所指出的,
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;
}
模板
尺寸
尺寸(T常数和c)
{
返回c.size();
}
模板
尺寸
尺寸(T&a)[n])
{
返回n;
}

(在现代C++中,第二个甚至可以是代码> CONTXPRPR < /代码>)< /P> 考虑到这一点,您可以编写

size(myInts)
,而不管
是一个
std::array
或一个C样式的数组。

正如其他人所指出的,
std::array
是一个添加的扩展 到C++11(所以您可能没有),它包装了一个C风格的数组, 为了给它一些(但不是全部)类似STL的接口。 其目标是,它可以在C风格数组的任何地方使用 可以;特别是,它接受相同的初始化语法 作为C样式数组,如果初始化类型允许静态 初始化时,其初始化也可以是静态的。(打开 另一方面,编译器无法从 初始值设定项列表的长度,它可以为较旧的 C样式数组。)

关于大小,任何有经验的程序员都会 工具箱中的大小函数,与
std::begin
std::end
(它们是C++11扩展,和 在C++11标准化之前,每个人都在他们的工具箱中 是的