C++;数组_put() 你好,我对C++无限数组有疑问。这个array_put()函数通过创建新数组是否是增加数组大小的最佳方法?也许还有比这更快的方法(
这是我在用谁,我不确定C++;数组_put() 你好,我对C++无限数组有疑问。这个array_put()函数通过创建新数组是否是增加数组大小的最佳方法?也许还有比这更快的方法(,c++,arrays,C++,Arrays,这是我在用谁,我不确定 #include <windows.h> #include <iostream> #include <sstream> using namespace std; // ============================================================ // ALERT WINDOW // ================================
#include <windows.h>
#include <iostream>
#include <sstream>
using namespace std;
// ============================================================
// ALERT WINDOW
// ============================================================
void alert(string value, string title = "Warning")
{
MessageBox(NULL, value.c_str(), title.c_str(), MB_OK);
}
// ============================================================
// ============================================================
// INTEGER TO STRING
// ============================================================
string integer_to_string(int value)
{
ostringstream stream;
stream<<value<<flush;
return stream.str();
}
// ============================================================
// ============================================================
// ARRAY PUT
// ============================================================
typedef struct ARRAY{
int* data;
int length = 0;
} array;
void array_put(array &array_data, int value)
{
int* new_array = new int[array_data.length+1];
if (array_data.length != 0){new_array = array_data.data;}
new_array[array_data.length] = value;
array_data.data = new_array; array_data.length++;
}
// ============================================================
// ============================================================
// ARRAY PRINT (REQ: ARRAY PUT)
// ============================================================
string array_print(array array_data)
{
string out = "";
out += "array_length: " + integer_to_string(array_data.length) + "\n";
for (int i=0;i < array_data.length;i++)
{
out += "[" + integer_to_string(i) + "] = " + integer_to_string(array_data.data[i]) + "\n";
}
return out;
}
// ============================================================
int main()
{
array array_data;
array_put(array_data, 120);
array_put(array_data, 170);
string result = array_print(array_data);
alert(result);
return 0;
}
#包括
#包括
#包括
使用名称空间std;
// ============================================================
//警报窗口
// ============================================================
无效警报(字符串值,字符串标题=“警告”)
{
MessageBox(NULL,value.c_str(),title.c_str(),MB_OK);
}
// ============================================================
// ============================================================
//整数到字符串
// ============================================================
字符串整数到字符串(int值)
{
ostringstream;
stream函数数组\u put完全无效。例如,函数中存在内存泄漏。首先,您分配了内存并将其地址分配给了新的\u数组,然后在下一个语句中重新分配了新的\u数组。因此,分配的内存地址丢失
我想不是这个
void array_put(array &array_data, int value)
{
int* new_array = new int[array_data.length+1];
if (array_data.length != 0){new_array = array_data.data;}
new_array[array_data.length] = value;
array_data.data = new_array; array_data.length++;
}
你的意思是
void array_put( array &array_data, int value )
{
int *data = new int[array_data.length+1];
std::copy( array_data.data, array_data.data + array_data.length, data );
data[array_data.length] = value;
delete [] array_data.data;
array_data.data = data;
++array_data.length;
}
当然,如果您使用标准类std::vector而不是手动分配数组会更好。代码中存在多个问题。首先
new_array = array_data.data;
不将旧数组的内容复制到新数组,它只分配指针,因此新数组之后与array_data.data相同。您可以在此处使用memcpy:
memcpy(new_array, array_data.data, sizeof(int)*array_data.length);
您还需要在启动新存储之前释放旧阵列数据,以避免泄漏,因此:
delete [] array_data.data;
array_data.data = new_array;
在使代码正常工作后,您可以考虑分配更多的存储空间,以避免在每个数组中分配新的数组。其他人已经指出了代码中的错误,并指出您可能应该使用vector
而不是自行开发的解决方案。但是还没有人解决这个问题我们的实际问题是是否有更快的方法
假设您通常向同一数组中添加多个元素,这确实不是最优的:按原样(更正错误后),您将为每个附加条目重新分配数组,并复制以前存储的所有数据。由于数据将随着每个元素的增加而增加,因此插入的复杂性是二次的(必须制作的副本数量与插入的元素数量的平方成正比),以及昂贵的重新分配的线性数量
更好的策略是始终将现有元素数量的某一部分分配为新元素,并跟踪其中有多少元素实际上是数组的一部分,以及有多少元素已经预先分配,以便以后添加新元素。这样可以减少重新分配的数量,越多,数组就越大是,并最终为您提供了一个摊销的常量复杂性(平均而言,要执行的拷贝数与插入的元素数成正比),以及一个昂贵的重新分配对数
事实上,这正是向量所做的。除了解决方案不起作用之外,每次将大小增加1意味着添加N个项目将需要O(N*N)个副本-您复制1个项目,然后是2个,然后是3个,依此类推
只需使用vector
。它可以工作,并且保证平均在固定时间内添加元素。您可以研究使用std::vector,如果需要更大的大小,它将自动(或手动)处理重新分配。