在Xcode下的C++中声明int的数组
Declaring array of int in C++ under Xcode
这两个声明之间有什么区别?
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::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 )
,不管它是否是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;
}
并且从两个阵列得到相同的结果
- 按字符值访问int数组
- 将 int 数组转换为 std::vector<int*>
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 整数区间(或 int 数组)中每个数字的出现次数
- Int 数组到C++容器
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 如何检测将文本文件读入 int 数组的新行
- C++快速将 int 数组内容转储到文本文件中
- <string> 如何在使用 SWIG 时将 int 数组和 List 作为参数传递给 C# C++
- 如何制作不允许重复值的 C++ int 数组循环?
- 如何将逗号分隔的文件读取为 2D int 数组?
- int 数组,但索引是字符?
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 将 int 数组转换为带有小数C++的双精度数组
- 将双精度值分配给 int 数组时的类型转换
- 已编辑 我如何将其拆分为 char 和 int 数组
- 从 C++ 中的 int ** 数组访问元素
- C++程序无法分配 int 数组?
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- 如何通过头文件中的函数初始化 const int 数组?