[英]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);
}
您可以做的另一種選擇是通過直接訪問數字的位數來避免完全使用數組:
unsigned int getDigit(unsigned int number, unsigned int index) {
// See http://stackoverflow.com/questions/4410629/finding-a-specific-digit-of-a-number
}
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 http://stackoverflow.com/questions/1306727/way-to-get-number-of-digits-in-an-int
}
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;
}
這使您可以將數字視為數組,而無需實際初始化數組。 您甚至可以將其變成一個類,並使用運算符重載來獲取實際的數組語義。
您可以改用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
使用我的gcc版本4.6.3,可以進行以下操作:
int MyFunction(int number)
{
int myarr[int(ceil(log(number)))];
....
return 0;
}
編輯:C99這是有效的,請參見: 在運行時允許數組大小而無需動態分配?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.