嘿所以我想创建大小为n
的{{1}}数组(基于用户输入)(也是关闭用户输入)。我想这样做的方法是进行for循环执行x
次迭代,并在循环内部询问用户n
。问题是我不确定如何使用变量x
命名数组,我想的是:
n
总结我的问题是:你能用C ++中的变量创建/命名数组吗?
答案 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> >
就足够了。