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,如果需要更大的大小,它将自动(或手动)处理重新分配。