C ++:动态创建以for循环迭代器命名的数组

时间:2013-03-02 18:54:33

标签: c++ arrays variables naming

嘿所以我想创建大小为n的{​​{1}}数组(基于用户输入)(也是关闭用户输入)。我想这样做的方法是进行for循环执行x次迭代,并在循环内部询问用户n。问题是我不确定如何使用变量x命名数组,我想的是:

n

总结我的问题是:你能用C ++中的变量创建/命名数组吗?

3 个答案:

答案 0 :(得分: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;它使您的代码更难以阅读和调试。

答案 1 :(得分:0)

这里有3个解决方案:第一个是最接近你的示例代码,第二个是改进,以便能够正确检索边界内的数组元素,第三个是为什么你更好地服务于{{1 }}第

解决方案1:

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

vector

解决方案2:

但是,使用上面的代码,您将无法访问每个内部数组的元素。除非你记住你用它创建的每个内部数组的大小,否则你可能会访问一些超出界限的东西。因此,对此代码的更新将是添加另一个数组,我们称之为#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; } ,其中每个元素sizeOfInnerArrays都会跟踪内部数组i的大小。这是更新:

array[i]

解决方案3:

但是,这太复杂了,所以最好使用容器,如 #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; } ,就像乔建议的那样,其数据成员会跟踪其大小。

vector

答案 2 :(得分: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

我不确定你想要达到的是什么,但最有可能是更合适的解决方案。是否真的有必要通过他们的名字访问这些数组?我很确定普通std::vector< std::vector<double> >就足够了。