我是C++的新手,目前正在通过自己的一本书学习它。这本书似乎说,根据你如何声明它,有几种类型的数组。我想动态数组和静态数组之间的区别我是很清楚的。但是我不明白STL std::array
类和静态数组之间的区别。
STL std::array
变量声明为:
std::array < int, arraySize > array1;
而静态数组变量则声明为:
int array1[arraySize];
这两者之间有根本的区别吗?或者只是语法问题,两者基本上是一样的?
发布于 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
可能是更好的选择。
发布于 2016-11-24 04:14:41
std::array<>
和C风格数组的主要区别在于前者是一个包装了后者的类。该类具有begin()
和end()
方法,允许将std::array
对象作为参数轻松传递给期望迭代器的STL算法(请注意,C样式的数组也可以通过非成员std::begin
/std::end
方法)。第一个指向数组的开头,第二个指向数组末尾之外的一个元素。您可以在其他STL容器中看到这种模式,例如std::vector
、std::map
、std::set
等。
STL std::array
的另一个好处是它有一个size()
方法,可以让您获得元素计数。要获得C样式数组的元素数,必须编写sizeof(cArray)/sizeof(cArray[0])
,所以stlArray.size()
看起来不是更具可读性吗?
你可以在这里获得完整的参考资料:
发布于 2016-11-24 04:14:22
通常你应该更喜欢std::array<T, size> array1;
而不是T array2[size];
,尽管它们的底层结构是相同的。
主要原因是std::array
总是知道它的大小。您可以调用它的size()方法来获取大小。然而,当你使用C风格的数组(即你所说的“内置数组”)时,你总是需要将大小传递给使用该数组的函数。如果你以某种方式弄错了,你可能会导致缓冲区溢出,函数会尝试从不再属于该数组的内存中读取/写入。这不会发生在std::array
上,因为大小总是很清楚。
https://stackoverflow.com/questions/40773259
复制相似问题