当我们想要创建一个任意大小的数组(在一本电子书中提供)时,能否请您解释一下将数组大小加倍的重点:
#include <iostream>
using namespace std;
int *growArray (int* p_values, int cur_size);
int main ()
{
int next_element = 0;
int size = 10;
int *p_values = new int[ size ];
int val;
cout << "Please enter a number: ";
cin >> val;
while ( val > 0 )
{
if ( size == next_element + 1 )
{
// now all we need to do is implement growArray
p_values = growArray( p_values, size );
}
p_values[ next_element ] = val;
cout << "Please enter a number (or 0 to exit): ";
cin >> val;
}
}
int *growArray (int* p_values, int cur_size)
{
int *p_new_values = new int[ cur_size * 2 ];
for ( int i = 0; i < cur_size; ++i )
{
p_new_values[ i ] = p_values[ i ];
}
delete p_values;
return p_new_values;
}
我们不能做这样的事情:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;
int main ()
{
int next_element = 0;
int size = 10;
int *p_values = new int[ size ];
int val;
cout << "Please enter a number: ";
cin >> val;
while ( val > 0 )
{
p_values[ next_element ] = val;
cout << "Please enter a number (or 0 to exit): ";
cin >> val;
next_element += 1;
if (next_element > size) size += 1;
}
for (int i = 0; i< size; i++) {
cout << p_values[i]; }
cin.get();
cin.ignore();
}
答案 0 :(得分:1)
这基本上是用一种相当天真的分配方法模仿std::vector
;如果你只增加1,你很可能经常做这个大小的增加(这是一个非常计算密集的操作!
这就是为什么矢量通常比一个元素增长更多的原因;分配内存和复制所有现有数据是非常昂贵的,你想要最小化它的可能性,当然没有在一开始就分配所有内存。因此,将分配的大小加倍是一种权衡。
顺便说一下,在你的代码中,增加size
变量不会给你更多的内存......访问array[size]
因此只会在你的最后一个元素之后给你内存中的任何内容(或分段错误,如果该内存不属于您的进程的虚拟内存空间)。
答案 1 :(得分:0)
使用第二种方法,p_values在开头只初始化一次,作为大小为10的整数数组。
int *p_values = new int[ size ];
之后更改size变量的值不会改变这一点,p_values将保持大小为10,直到您更改它指向的位置。所以在10个条目之后,你将会崩溃。
这就是本书示例中的growArray函数的用途:扩展数组的最大容量:
int *p_new_values = new int[ cur_size * 2 ];
for ( int i = 0; i < cur_size; ++i )
{
p_new_values[ i ] = p_values[ i ];
}
delete p_values;
它首先定义了一个更大尺寸的全新数组(两次)。 然后,它将已存在的值从新数组复制到新数组。 然后它删除旧数组以节省一些内存,你所要做的就是使用新的“p_new_values”变量。
编辑:正如其他答案中所说,最好的方法是直接使用矢量,这是一种故意用来简化这个问题的结构。但我想你的书将在稍后解释。 至于为什么加倍大小,它可能是+10,或者其他什么,但每次你调用growArray函数时,你必须再次复制所有数据,这不是那么好,所以你想避免经常这样做。加倍通常是一个不错的选择。