C++ 中的动态数组大小
Dynamic Array Size in C++
我正在寻找一种方法来根据传递的参数动态设置整数数组的大小。
例如伪代码中的这个:
int MyFunction(int number)
{
int myarr[amount of digits in number];
}
因此,当输入为 13456 时,int array[]
大小应为 5。
当我不知道大小的常量时,在 C++ 中执行此操作的最快方法是什么?
您不能创建具有 运行 时间大小的数组,它必须在编译时已知。我建议改用 std::vector
。
一种解决方案是在转换为字符串后计算字符数
#include <string>
int MyFunction(int number)
{
std::vector<int> myarr(std::to_string(number).size());
}
从数学上讲,您可以取对数(以 10 为底)求一个数的位数。
#include <cmath>
int MyFunction(int number)
{
int numDigits = static_cast<int>(std::log10(number)) + 1;
std::vector<int> myarr(numDigits);
}
您可以改用 vector
- 实际上我认为在这种情况下是最好的选择。创建一个具有一些初始大小的向量。然后你可以动态增加它 -
int initialSize = 5;
vector<int> myvector(initialSize, 0); //hold "initialSize" int's
// and all initialized to zero
myvector[0] = 567; // assign values like a c++ array
您可以做的另一个选择是通过直接访问数字的数字来避免完全使用数组:
unsigned int getDigit(unsigned int number, unsigned int index) {
// See
}
unsigned int setDigit(unsigned int number, unsigned int index, unsigned int newVal) {
// intPower is from the question linked to above.
return number - get(number, index)*intPower(10, index) + newVal*intPower(10, index);
}
unsigned int size(unsigned int number) {
// See
}
unsigned int push_back(unsigned int number, unsigned int newDigit) {
// Assuming no overflow
return 10*number + newDigit;
}
unsigned int pop(unsigned int number) {
// Assume number != 0
return number / 10;
}
这样您就可以将您的数字视为一个数组,而无需实际初始化该数组。您甚至可以将其转换为 class 并使用运算符重载来获取实际的数组语义。
使用我的 gcc 4.6.3 版可以实现以下功能:
int MyFunction(int number)
{
int myarr[int(ceil(log(number)))];
....
return 0;
}
编辑:C99 这是有效的见:Array size at run time without dynamic allocation is allowed?
我正在寻找一种方法来根据传递的参数动态设置整数数组的大小。 例如伪代码中的这个:
int MyFunction(int number)
{
int myarr[amount of digits in number];
}
因此,当输入为 13456 时,int array[]
大小应为 5。
当我不知道大小的常量时,在 C++ 中执行此操作的最快方法是什么?
您不能创建具有 运行 时间大小的数组,它必须在编译时已知。我建议改用 std::vector
。
一种解决方案是在转换为字符串后计算字符数
#include <string>
int MyFunction(int number)
{
std::vector<int> myarr(std::to_string(number).size());
}
从数学上讲,您可以取对数(以 10 为底)求一个数的位数。
#include <cmath>
int MyFunction(int number)
{
int numDigits = static_cast<int>(std::log10(number)) + 1;
std::vector<int> myarr(numDigits);
}
您可以改用 vector
- 实际上我认为在这种情况下是最好的选择。创建一个具有一些初始大小的向量。然后你可以动态增加它 -
int initialSize = 5;
vector<int> myvector(initialSize, 0); //hold "initialSize" int's
// and all initialized to zero
myvector[0] = 567; // assign values like a c++ array
您可以做的另一个选择是通过直接访问数字的数字来避免完全使用数组:
unsigned int getDigit(unsigned int number, unsigned int index) {
// See
}
unsigned int setDigit(unsigned int number, unsigned int index, unsigned int newVal) {
// intPower is from the question linked to above.
return number - get(number, index)*intPower(10, index) + newVal*intPower(10, index);
}
unsigned int size(unsigned int number) {
// See
}
unsigned int push_back(unsigned int number, unsigned int newDigit) {
// Assuming no overflow
return 10*number + newDigit;
}
unsigned int pop(unsigned int number) {
// Assume number != 0
return number / 10;
}
这样您就可以将您的数字视为一个数组,而无需实际初始化该数组。您甚至可以将其转换为 class 并使用运算符重载来获取实际的数组语义。
使用我的 gcc 4.6.3 版可以实现以下功能:
int MyFunction(int number)
{
int myarr[int(ceil(log(number)))];
....
return 0;
}
编辑:C99 这是有效的见:Array size at run time without dynamic allocation is allowed?