1

C/С++ 配列についてあなたの助けが必要です。私は 3 年間 Python でプログラミングしてきましたが、その配列 (と呼ばれるlist) は非常に扱いやすいものです。

>>> array = [1,2,3,4]
>>> array.append(5)
>>> array
[1,2,3,4,5]

C/C++ で読んだように、配列へのポインターを作成する必要があります。の配列を含みchar、append メソッドを 1 つだけ持つクラスの小さなスケッチを作成してください。このメソッドは、呼び出されてパラメータとして aappendを受け取りcharます。このメソッドは、配列のサイズを 1 増やし、指定charされた をこの配列に追加します。

これは宿題だと思う人もいるかもしれませんが、配列、ポインター、およびメモリ割り当てがどのように機能するかの原則を理解できません。難しいことではないと思いますが、Python のような言語の後で難しいのは、Python ではそのようなことを気にしていなかったからです。説明付きの小さなコードを教えてください。

前もって感謝します!

4

5 に答える 5

5

これは標準の C++ プログラムです。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> array = {1, 2, 3, 4};
    array.push_back( 5 );

    for( auto const item : array )
    {
        cout << item << " ";
    }
    cout << endl;
}

Visual C++ 固有。

Microsoft の Visual C++ の最新バージョン、つまり2012 年 11 月の CTPでさえ、バージョン 11.0 であり、C++11 標準をサポートするための修正が多数含まれていますが、上記で使用した一般的な初期化をまだサポートしていません。

Visual C++ では、C++03 と同様に、その表記法はいわゆる集約型に対してのみサポートされます。これは本質的に、純粋な raw 配列または純粋な raw 構造体 (より多くの C++ 風の型を含む場合があります)、または組み込み型です。したがって、Visual C++ でこれを行う 1 つの方法は、未加工の配列にその表記法を使用し、その未加工の配列を使用して を初期化することvectorです。

#include <iostream>
#include <iterator>     // std::begin, std:.end
#include <vector>
using namespace std;

int main()
{
    int const   data[]  = {1, 2, 3, 4};
    vector<int> array( begin( data ), end( data ) );
    array.push_back( 5 );

    for( auto const item : array )
    {
        cout << item << " ";
    }
    cout << endl;
}

これは、Visual Studio 2012 に同梱されている基本の Visual C++ 11.0 でも正常にコンパイルされます。

ただし、範囲ベースのforループは、おそらく Visual C++ 10.0 (Visual Studio 2010 に対応) ではコンパイルされません。

于 2012-11-24T15:18:11.890 に答える
2

C と C++ は異なる言語です。

最新の C++ では、生の配列を使用しないことがよくありますが、たとえば、 push_backメンバー関数を提供するstd::vectorを使用します。

于 2012-11-24T15:14:56.997 に答える
1

C++ では通常、生の (C スタイルの) 配列を使用することはなく、代わりにstd::vector(動的サイズ) やstd::array(C++11 では固定サイズ) などのコンテナーを使用します。これらを実装すると、arrayクラスは簡単になります (ただし、要素にアクセスする方法を指定していないため、まったく使用できません)。

class array {
    std::vector<char> v_;
  public:
    void append(char c) {
      v_.push_back(c);
    }
};
于 2012-11-24T15:16:07.397 に答える
0

配列はサイズを変更できません。ただし、C++ ではリストを使用できます

http://www.cplusplus.com/reference/list/list/

于 2012-11-24T15:15:51.610 に答える
0

C と C++ の両方で配列という用語は、同じ型の 1 つ以上のデータ要素を含む連続したメモリ ブロックを表すために使用されます。

配列には、静的配列と動的配列の 2 種類があります。静的配列は、プログラムがコンパイルされ、プログラムのデータ セグメントに格納されるときにメモリに割り当てられます。動的配列は、その名前が示すように、実行時にヒープ (プログラムが動的割り当てのために使用できるメモリにアクセスするために使用されるデータ構造) から割り当てられます。

両方の配列型は、ポインターとインデクサー ([] 演算子) を使用して同じ方法でアクセスされます。

C と C++ の両方で、ポインターはメモリ内の場所を指す変数です。それが指すメモリには、クラスまたはプリミティブ データ型が含まれる場合があります。

ただし、静的配列と動的配列には違いがあります。重要なものは次のとおりです。

  1. 動的配列は、それらを使用するために割り当て、メモリリークを防ぐために解放する必要があります
  2. 静的配列はサイズ変更できません

C では、 を使用してメモリを割り当て、 を使用mallocして解放しfreeます。を使用してサイズを変更できますrealloc

C++ では、 を使用してメモリを割り当て、 を使用newして解放しdeleteます。サイズを変更するには、独自のコードを記述する必要があります。

ほとんどの場合、C++ の動的配列は を使用して実装されstd::vectorます。C では、そのようなメカニズムが必要な場合は、独自に作成する必要があります。@Cheers と hthから良い回答がありました。std::vector-アルフオン

ここは、C または C++ での動的メモリに関する完全なチュートリアルを書く場所ではないと思います。http://www.cplusplus.com/doc/tutorial/dynamic/から良い紹介を得ることができます

ただし、C で必要なことを行う方法を示すサンプル コードを次に示します。C++ の場合は、std::vector.

/*
C CODE
*/

#include <stdlib.h>
#include <limits.h>

typedef struct DARRAY dynamic_int_array_t;

typedef struct DARRAY
{
    int length;
    int *data;
    void (*alloc)(dynamic_int_array_t * the_array, int length);/*allocate*/
    void (*free)(dynamic_int_array_t * the_array);/*free*/
    void (*resize)(dynamic_int_array_t * the_array, int new_length);/*resize*/
    void (*append)(dynamic_int_array_t * the_array, int new_value);
    int (*get_at)(dynamic_int_array_t * the_array, int pos);/*use 1 based index getter*/
    void (*set_at)(dynamic_int_array_t * the_array, int pos, int value);/*use 1 based index setter*/
}dynamic_int_array_t;

void allocIntArray(dynamic_int_array_t * the_array, int length)
{
    /*
    Allocate memory to contain length number of integers
    */
    the_array->data = (int*)malloc(length*sizeof(int));
    the_array->length = length;
}

void freeIntArray(dynamic_int_array_t * the_array)
{
    if(NULL != the_array->data)
        free(the_array->data);/*Free the memory*/
    the_array->length = 0;/*Reset the length of the array*/
}

void resizeIntArray(dynamic_int_array_t * the_array, int new_length)
{
    if(NULL != the_array->data && the_array->length > 0 && new_length >= 0)
    {

        if(new_length == 0)/*Free the array if a value of 0 was requested*/
            the_array->free(the_array);
        else
        {
            /*Resize the memory block*/
            the_array->data = (int*)realloc(the_array->data, new_length*sizeof(int));
        }
        the_array->length = new_length;
    }
}

void appendIntArray(dynamic_int_array_t * the_array, int new_value)
{   
    the_array->resize(the_array, the_array->length + 1);
    the_array->data[the_array->length - 1] = new_value;
}

int getAt(dynamic_int_array_t * the_array, int pos)
{
    if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
        return the_array->data[pos-1];
    return INT_MIN;/*use INT_MIN to indicate error*/
}

void setAt(dynamic_int_array_t * the_array, int pos, int value)
{
    if(NULL != the_array->data && pos > 0 && pos <= the_array->length)
        the_array->data[pos-1] = value;
}

int main(int argc, char **argv)
{
    dynamic_int_array_t int_array = 
    {
        0,
        NULL,
        allocIntArray,
        freeIntArray,
        resizeIntArray,
        appendIntArray,
        getAt,
        setAt       
    };

    int_array.alloc(&int_array, 4);
    int_array.data[0] = 1, int_array.data[1] = 2,
        int_array.data[2] = 3, int_array.data[3] = 4;
    printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,4));
    int_array.resize(&int_array, 5);
    int_array.data[4] = 5;/* can also use int_array.set_at(&int_array,5) = 5; */
    printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
    int_array.append(&int_array, 6);
    printf("array length: %d, last member: %d\n", int_array.length, int_array.get_at(&int_array,5));
}
于 2012-11-24T17:08:30.680 に答える