在Xcode下的C++中声明int的数组

Declaring array of int in C++ under Xcode

本文关键字:int 数组 声明 Xcode 下的 C++      更新时间:2023-10-16

这两个声明之间有什么区别?

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

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

关于大小,任何有经验的程序员都会他们工具包中的size函数,与std::beginstd::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 ),不管它是否是CCD_ 6或C风格的数组。

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

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

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

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

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

相反,使用array<int,5> myints;可以声明array类型的对象,这是STL定义的容器类(http://en.cppreference.com/w/cpp/container/array),进而实现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;
}

并且从两个阵列得到相同的结果