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++ 进行编程,因此您应该使用 STL 容器(尤其是std::vector)而不是 C 样式的数组。

如果您需要使用在运行时创建的字符串来访问数组,那么您可以使用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

我不确定您要达到的目标到底是什么,但很可能有更合适的解决方案。真的有必要通过它们的名字访问这些数组吗?我很确定这里的 commonstd::vector< std::vector<double> >就足够了。

于 2013-03-02T19:18:18.327 回答
0

这里有 3 个解决方案:第一个最接近您的示例代码,第二个是为了能够正确检索范围内的数组元素而进行的改进,第三个是使用vectors 更好地为您服务的原因。

解决方案1:

看起来您希望您的数组具有可通过循环迭代器区分的名称。就像 Joe 说的那样,你可以有一个数组的数组,所以内部数组将被命名为 array[0]、array[1]、...、array[n - 1]。这将通过使用指向双精度指针的指针来实现。每个内部指针都将用于动态分配双精度数组。不要忘记删除动态分配的内存。

#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 回答