1

私はいくつかの割り当てを行っており、ここで 1 つの時点で動けなくなりました。list_add() 関数を作成しようとしています。その最初の機能は、配列に値を追加することです。2 つ目の機能は、配列のサイズを大きくすることです。したがって、ベクトルのように機能します。正解するかはわからないけど。私が試みたのは、古いものよりも大きい動的に割り当てられた新しい配列を作成し、すべての値を新しい配列にコピーすることです。

それは正しいアプローチですか?

本体はこちら

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;
    }
}
4

5 に答える 5

1

あなたは正しい考えを持っていますが、実装は少し「肘のグリース」を使用することができます

これを試して:

2intを保持

容量-サイズを割り当てる長
さ-配列の現在の終わり

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++

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/

于 2009-11-24T23:21:14.360 に答える
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から戻った後でも、リストポインタが古い場所を指していることがわかると思います。

于 2009-11-24T23:23:14.120 に答える
1

コードの実装には 4 つの問題があります。

  1. リストの要素はコピーされません。
  2. new_listの値をlist変数に代入しませんmain
  3. 最後の値の後ではなく、後ろから前に値を挿入します
  4. max_size更新されません。毎回配列のサイズを 1 ずつ増やすだけなので、これを見逃すのは簡単です。そうすれば、値が追加されるたびに割り当てる必要があります。新しいサイズを 1 倍以上増やしても、毎回再割り当てされます。

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.

2 番目の問題は、リストへのポインタを返すことで修正できます。main関数を次のように変更します。

for (int i = 0; i < 11; i++) {
    list = list_add(list, used, N, i); 
} 

3番目の問題は、この行を変更することで修正できます

list_new[max_size-space_used-1] = value;

list_new[space_used++] = value;

この後の も削除する必要がありますspace_used++

4 番目の問題を表示するには、この行を変更する必要があります

int new_max_size = space_used+1;

int new_max_size = space_used+3;

毎回再割り当てされます。ただし、2 回だけ再割り当てする必要があります。


これは完全なコードです:

#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] << ". ";
    }
}
于 2009-11-25T10:48:07.967 に答える
0

私はこの行について心配します:

*(list+(max_size-space_used-1)) = value;

そしてこれ:

list_new[i] = i;
于 2009-11-24T23:17:27.837 に答える
-2

問題を解決する方法を知ることについては、多くのことが語られていますが、これはその 1 つではありません。

#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";
}

更新:上記の他の回答に示されているように、彼の関数には16行に少なくとも4つのバグが含まれています。これは、コードの 4 行ごとに発生するバグです。そして、コードの設計に問題があります。たとえば、配列のサイズと配列自体は一緒にする必要があります。そうしないと、関数が機能することを保証できません。

コードの 2 つの問題 (2,4) はstruct、配列ポインタとデータ構造の max_size を含む を使用することで解決できます。そうすれば、2 つの変数を一緒に渡す必要があります。

于 2009-11-24T23:38:38.903 に答える