0

nねえ、サイズの配列(ユーザー入力に基づく)(ユーザー入力にも基づく)を作成したいと思いますx。私が考えていた方法は、 for ループでn反復を実行し、ループ内でユーザーにx. 問題は、変数を使用して配列に名前を付ける方法がわからないことですn。次のようなことを考えていました。

cout << "Enter n: ";
cin >> n

for (i = 0; i < n; i++)
{
    cout << "Enter x: ";
    cin >> x;

    double*array+i;
    array+i = new double[x]
}

私の質問を要約すると: C++ で変数を使用して配列を作成/名前付けできますか?

4

3 に答える 3

1

残念ながら、C++ではこれを行うことはできません。このようなことを試してください...

std::cout << "Enter n: ";
std::cin >> n

std::vector<std::vector<double> > arrays(n);

for (std::size_t i = 0; i < n; i++)
{
    std::cout << "Enter x: ";
    std::cin >> x;

    arrays[i].reserve(x);
}

reserve割り当てるだけで、std::vector;内のオブジェクトは作成されません。それらも構築したい場合は、を使用してresizeください。

PS決して使用しないでくださいusing namespace std; コードの読み取りとデバッグが難しくなります。

于 2013-03-02T19:05:09.480 に答える
0

C++ でプログラミングしているため、std::vectorC スタイルの配列の代わりに STL コンテナー (特に ) を使用する必要があります。

実行時に作成された文字列を使用して配列にアクセスする必要がある場合は、 を使用できますがstd::map< std::string, std::vector<double> >、これは非常にクレイジーなアイデアです。

typedef std::vector<double> MyVector;
std::map<std::string, MyVector> myVectors;

// create an array:
std::string arrayName;
arrayName = std::string("someArray");       // could be: std::cin >> arrayName;
myVectors[arrayName] = MyVector(10, 1.23);  // new vector of size 10

std::cout << myVectors["someArray"][4];     // prints 1.23

あなたが何を達成しようとしているのか正確にはわかりませんが、おそらくもっと適切な解決策があります。名前を介してこれらの配列にアクセスする必要は本当にありますか? std::vector< std::vector<double> >ここではコモンで十分だと確信しています。

于 2013-03-02T19:18:18.327 に答える
0

vectorここに 3 つの解決策があります。1 つ目はサンプル コードに最も近いもので、2 つ目は境界内の配列要素を正しく取得できるようにするための改善であり、3 つ目はsを使用したほうがよい理由です。

解決策 1:

配列には、ループ反復子で区別できる名前を付けたいようです。ジョーが言ったように、配列の配列を持つことができるので、内側の配列は配列[0]、配列[1]、...、配列[n - 1]と名付けられます。これは、double へのポインターへのポインターを使用して実現されます。各内部ポインターは、double の配列を動的に割り当てるために使用されます。動的に割り当てられたメモリを削除することを忘れないでください。

#include <iostream>
int main()
{
    unsigned int n;
    std::cout << "Enter number of arrays: ";
    std::cin >> n;
    double** array = new double*[n];

    for (int i = 0; i < n; ++i)
    {
        unsigned int size;
        std::cout << "Enter size of array " << i << ": ";
        std::cin >> size;
        array[i] = new double[size];
        for (int j = 0; j < size; ++j)
        {
            int element;
            std::cout << "Enter element " << j << " of array " << i << ": ";
            std::cin >> element;
            array[i][j] = element;
        }
    }

    for (int i = 0; i < n; ++i)
    {
        delete [] array[i];
    }
    delete[] array;
    return 0;
}

解決策 2:

ただし、上記のコードでは、各内部配列の要素にアクセスするのに問題があります。これで作成する各内部配列のサイズを覚えていない限り、範囲外のものにアクセスする可能性があります。したがって、このコードを更新すると、さらに別の配列を追加することになります。それを と呼びましょうsizeOfInnerArrays。ここで、その要素のそれぞれがi内部配列のサイズを追跡しarray[i]ます。アップデートは次のとおりです。

    #include <iostream>
    int main()
    {
        unsigned int n;
        std::cout << "Enter number of arrays: ";
        std::cin >> n;
        double** array = new double*[n];
        unsigned int* sizeOfInnerArrays = new unsigned int[n];

        for (int i = 0; i < n; ++i)
        {
            std::cout << "Enter size of array " << i << ": ";
            std::cin >> sizeOfInnerArrays[i];
            array[i] = new double[sizeOfInnerArrays[i]];
            for (int j = 0; j < sizeOfInnerArrays[i]; ++j)
            {
                int element;
                std::cout << "Enter element " << j << " of array " << i << ": ";
                std::cin >> element;
                array[i][j] = element;
            }
        }

        //prints out each array as curly-brace enclosed sets of doubles
        for (int i = 0; i < n; ++i)
        {
            std::cout << "{";
            for (int j = 0; j < sizeOfInnerArrays[i] - 1; ++j)
            {
                std::cout << array[i][j] << ", ";
            }
            std::cout << array[i][sizeOfInnerArrays[i] - 1] << "}" << std::endl;
        }

        // free dynamically allocated memory
        for (int i = 0; i < n; ++i)
        {
            delete [] array[i];
        }
        delete[] array;
        delete[] sizeOfInnerArrays;

        return 0;
    }

解決策 3:

ただし、これは複雑すぎるため、vectorJoe が提案したように、データ メンバーがそのサイズを追跡する のようなコンテナーを使用することをお勧めします。

#include <iostream>
#include <vector>

int main()
{
    unsigned int n;
    std::cout << "Enter number of vectors: ";
    std::cin >> n;
    std::vector<std::vector<double> > myVec;
    // ^ space between closing angle brackets not needed
    //   if using C++11 conforming compiler

    for (int i = 0; i < n; ++i)
    {
        unsigned int size;
        std::cout << "Enter size of vector " << i << ": ";
        std::cin >> size;
        std::vector<double> temp;
        temp.reserve(size);
        for (int j = 0; j < size; ++j)
        {   
            double value;
            std::cout << "Enter next value of vector " << i << ": ";
            std::cin >> value;
            temp.push_back(value);
        }
        myVec.push_back(temp);
    }

    for (int i = 0; i < myVec.size(); ++i)
    {
        std::cout << "{";
        for (int j = 0; j < myVec.at(i).size() - 1; ++j)
        {
            std::cout << myVec.at(i).at(j) << ", ";
        }
        std::cout << myVec.at(i).back() << "}" << std::endl;
    }

    return 0;
}
于 2013-03-02T19:15:36.603 に答える