首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中声明数组

在C++中声明数组
EN

Stack Overflow用户
提问于 2016-11-24 04:04:45
回答 3查看 3.3K关注 0票数 17

我是C++的新手,目前正在通过自己的一本书学习它。这本书似乎说,根据你如何声明它,有几种类型的数组。我想动态数组和静态数组之间的区别我是很清楚的。但是我不明白STL std::array类和静态数组之间的区别。

STL std::array变量声明为:

代码语言:javascript
复制
std::array < int, arraySize > array1;

而静态数组变量则声明为:

代码语言:javascript
复制
int array1[arraySize];

这两者之间有根本的区别吗?或者只是语法问题,两者基本上是一样的?

EN

回答 3

Stack Overflow用户

发布于 2016-11-24 04:19:40

这两者之间的主要区别是一个重要的区别。

除了STL提供的很好的方法之外,当将std::array传递给函数时,没有衰减。这意味着,当您在函数中接收std::array时,它仍然是一个std::array,但是当您将一个int[]数组传递给一个函数时,它实际上衰减为一个int*指针,并且数组的大小丢失。

这是一个很大的区别。一旦您丢失了数组大小,代码现在就容易出现许多错误,因为您必须手动跟踪数组大小。sizeof()返回指针类型的大小,而不是数组中元素的数量。这迫使您使用像process(int *array, int size)这样的接口手动跟踪数组大小。这是一个不错的解决方案,但容易出错。

请参阅Bjarne Stroustroup的指南:

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rp-run-time

在许多其他STL类中,可以使用更好的数据类型来避免这种情况,std::array就是为这种数据类型而设计的。

顺便说一句,除非有充分的理由使用固定大小的数组,否则作为连续内存数据结构,std::vector可能是更好的选择。

票数 8
EN

Stack Overflow用户

发布于 2016-11-24 04:14:41

std::array<>和C风格数组的主要区别在于前者是一个包装了后者的类。该类具有begin()end()方法,允许将std::array对象作为参数轻松传递给期望迭代器的STL算法(请注意,C样式的数组也可以通过非成员std::begin/std::end方法)。第一个指向数组的开头,第二个指向数组末尾之外的一个元素。您可以在其他STL容器中看到这种模式,例如std::vectorstd::mapstd::set等。

STL std::array的另一个好处是它有一个size()方法,可以让您获得元素计数。要获得C样式数组的元素数,必须编写sizeof(cArray)/sizeof(cArray[0]),所以stlArray.size()看起来不是更具可读性吗?

你可以在这里获得完整的参考资料:

http://en.cppreference.com/w/cpp/container/array

票数 2
EN

Stack Overflow用户

发布于 2016-11-24 04:14:22

通常你应该更喜欢std::array<T, size> array1;而不是T array2[size];,尽管它们的底层结构是相同的。

主要原因是std::array总是知道它的大小。您可以调用它的size()方法来获取大小。然而,当你使用C风格的数组(即你所说的“内置数组”)时,你总是需要将大小传递给使用该数组的函数。如果你以某种方式弄错了,你可能会导致缓冲区溢出,函数会尝试从不再属于该数组的内存中读取/写入。这不会发生在std::array上,因为大小总是很清楚。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40773259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档