我正在做一些任务并且在这里陷入困境。 我正在尝试编写list_add()函数。它的第一个功能是向数组添加值。它的第二个功能是增加阵列的大小。所以它的工作方式很像矢量。我不知道如果我做对了。我尝试的是创建一个比旧的更大的动态分配数组,然后将所有值复制到新数组。
这是正确的方法吗?
这是主体
int main()
{
const int N = 7;
//declaring dynamic array allocation
int* list = new int[N];
int used = 0, a_val;
for(int i=0;i<11;i++)
{
list_add(list, used, N, i);
}
cout << endl << "Storlek: " << N << endl << endl;
cout << "Printar listan " << endl;
for(int i=0;i<used;i++)
{
cout << list[i] << ". ";
}
}
这是函数
bool list_add(int *list, int& space_used, int max_size, int value)
{
if(max_size-space_used > 0)
{
*(list+(max_size-space_used-1)) = value;
space_used++;
return true;
}
else
{
cout << "Increasing size of array!" << endl;
int new_max_size = space_used+1;
delete [] list;
int *list_new = new int[new_max_size];
for(int i=0; i<new_max_size; i++)
{
list_new[i] = i;
cout << list_new[i] << ". ";
}
cout << endl;
space_used++;
list = list_new;
return false;
}
}
答案 0 :(得分:1)
你有正确的想法,但实施可能会使用一点“肘部油脂”
试试这个:
保持2 int
容量 - 您分配的长度 size - 数组的当前结尾
if capacity <= size:
make new list( size = capacity x 2 )
memcopy old list into new list -> if you can't memcopy, copy over the data one-by-one
delete old list
if capacity > size:
list[size] = value
size++
答案 1 :(得分:1)
向我跳出的一个问题是,您没有更改list_add函数范围之外的列表指针的值。你应该做一些改变,比如......
bool list_add(int *list, int& space_used, int max_size, int value)
变为
bool list_add(int **list, int& space_used, int max_size, int value)
和
list = list_new
变为
*list = list_new
否则我认为您会发现当您重新分配列表时,从list_add返回后,您的列表指针仍将指向旧位置。
答案 2 :(得分:1)
您的代码实施存在四个问题:
new_list
的值分配给list
main
变量
max_size
未获得更新。很容易错过这个,因为你每次只增加一个数组的大小。这样,每次添加值时都需要分配。如果您将新大小增加一个以上,它仍然会每次都重新分配。第一个问题可以通过更改list_add
中的for循环来修复,以便复制:
for (int i = 0; i < space_used; i++) { // this also changed.
list_new[i] = list[i];
cout ...
}
// insert the new value (in the front?)
list_new[max_size-space_used-1] = value;
delete [] list; // Delete the list afterwards instead of earlier.
第二个问题可以通过返回指向列表的指针来修复。将main
功能更改为:
for (int i = 0; i < 11; i++) {
list = list_add(list, used, N, i);
}
可以通过更改此行来修复第三个问题
list_new[max_size-space_used-1] = value;
到
list_new[space_used++] = value;
此后您还应删除space_used++
。
要查看第四个问题,您应该更改此行
int new_max_size = space_used+1;
到
int new_max_size = space_used+3;
每次都会重新分配。但是,它应该只重新分配两次。
这是完整的代码:
#include <iostream>
using std::cout;
using std::endl;
int* list_add(int *list, int& space_used, int& max_size, int value) {
if (max_size - space_used > 0) {
list[space_used++] = value;
return list;
}
else {
cout << "Increasing size of array!" << endl;
int new_max_size = space_used+1;
int *list_new = new int[new_max_size];
for (int i = 0; i < space_used; i++) {
list_new[i] = list[i];
cout << list_new[i] << ". ";
}
cout << endl;
list_new[space_used++] = value;
max_size=new_max_size;
delete [] list;
return list_new;
}
}
int main() {
int N = 7;
//declaring dynamic array allocation
int* list = new int[N];
int used = 0, a_val;
for (int i = 0; i < 11; i++) {
list=list_add(list, used, N, i);
}
cout << endl << "Storlek: " << N << endl << endl;
cout << "Printar listan " << endl;
for (int i = 0; i < used; i++) {
cout << list[i] << ". ";
}
}
答案 3 :(得分:0)
我会担心这一行:
*(list+(max_size-space_used-1)) = value;
和这一个:
list_new[i] = i;
答案 4 :(得分:-2)
要知道如何解决问题,还有很多事要说,但这不是其中之一。
#include <vector>
#include <iostream>
int main()
{
std::vector<int> numbers;
for (int i = 0; i < 11; i++) {
numbers.push_back(i);
}
for (int i = 0; i < numbers.size(); i++) {
std::cout << numbers[i] << ". ";
}
std::cout << "\n";
}
更新:如上面my other answer所示,他的功能至少包含16行中的4个错误。这是每四行代码的错误。然后是代码设计存在问题。例如,数组的大小和数组本身应该在一起。您不能保证该功能有效。
代码(2,4)中的两个问题可以通过使用包含数组指针和数据结构的max_size的struct
来解决。这样你就必须把两个变量放在一起。