0

私は動的な2D配列で忙しく、次のように宣言しました。

string** MakeArray(int row,int col)
{
    string** array;
    array = new string* [col];

    for(int r = 0; r < row; r++)
    {
        array[r] = new string [col];
    }
    return array;
}

これで、文字列値を配列に配置できます。配列が4x99の場合、最初の列に整数値、2番目に文字列、3番目に整数を配置するにはどうすればよいですか?

4

4 に答える 4

3

配列内の要素はすべて同じタイプです。目的の情報を取得するには、構造体の配列を使用して、かなり異なる方法で開始することをお勧めします。

struct whatever { 
    int a;
    std::string b;
    int c;
};

std::vector<whatever> your_array;

編集:それはほぼ間違いなくお粗末な考えです、これを2D配列にする必要がある場合は、すべての要素を同じタイプの結合にすることを試みることができます。

union whatever { 
    int a;
    std::string b;
};

ただし、これにはかなり厳しい制限があります。実際、ユニオンに入れることstd::stringは公式にはまったくサポートされていません。それが機能する可能性はかなりありますが、それを保証するものではありません。本当に本当にこのようなことをする必要がある場合は、代わりにそのユニオンのメンバーをポインターにすることができます。それは機能することが保証されていますが、それを間違えることはほぼ避けられないほど不器用であることが保証されています。

于 2012-07-29T14:02:38.567 に答える
2

そうしないでください。代わりに、テーブル内の単一のレコードを表し、文字列と2つの整数を含む構造体を作成します。次に、それらの構造の1次元配列を作成します。

struct record
{
    int a;
    std::string b;
    int c;
};

record* MakeArray(int row)
{
    return new record[row];
}

さらに良いことに、配列を捨ててstd :: vectorを使用します:

std::vector<record> array(99); 
于 2012-07-29T14:03:16.217 に答える
1

C ++ 11を使用できる場合、タプルのベクトル/配列を使用することを検討しましたか?したがって、次のようなことができます。

#include <tuple>
#include <vector>

typedef std::tuple<int, std::string, int> MyTuple;

std::vector<MyTuple> MakeVector()
{
    std::vector<MyTuple> vecTuples;

     for( int i = 0; i < 5; ++i )
     {
         vecTuples.emplace_back( std::make_tuple<int, std::string, int>( i, "Test"+i, i+5 ) );
     }

     return vecTuples;
}
于 2012-07-29T14:07:48.753 に答える
0

C++は「強い型の」言語です。つまり、データ型を混在させることはできません(基本派生クラスの階層関係のように、データ型が関連している場合を除きます)。

言い換えれば、あなたがしていることは、C++が直接サポートしていることではありません。

あなたが望むことをするためにあなたができることがあると言ったので、次のようなトリプレットの配列を持っています:

struct triplet
{
  int first;
  string second;
  int third;
};

triplet** MakeArray(...

ただし、この例で行っていることは、JSコードによく似ています。たぶんあなたが望むのは、すべてのデータを文字列として保存することですか?そうです、文字列の2D配列を使用できますが、データを格納し、計算のために文字列から変換し直すときに、データを文字列に変換する必要があります。これは主要なパフォーマンスの問題です

于 2012-07-29T14:01:22.097 に答える