0

这两个声明有什么区别?

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

6 回答 6

3

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

关于大小,任何有经验的程序员都会在他们的工具包中拥有一个大小函数,与 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 ),无论它是std::arrayC 样式数组还是 C 样式数组。

于 2013-08-15T09:00:26.073 回答
1

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

有了它,std::array您将获得可以使数组更安全、更易于使用的辅助函数。

于 2013-08-15T08:44:53.337 回答
1

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

于 2013-08-15T08:46:43.883 回答
0

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

于 2013-08-15T08:45:42.423 回答
0

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

相反,通过使用,array<int,5> myints;您声明了一个类型的对象,它是由 STL ( http://en.cppreference.com/w/cpp/container/arrayarray )定义的容器类,它又实现了检索容器的大小。size()

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

于 2013-08-15T08:47:09.560 回答
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;

}

并从两个数组中获得相同的结果

于 2013-08-15T08:48:45.677 回答