2015-06-02 3 views
0

Я ищу способ динамически установить размер целочисленного массива в зависимости от переданного параметра. Например в этом псевдокоде:Динамический размер массива в C++

int MyFunction(int number) 
{ 
    int myarr[amount of digits in number]; 
} 

Итак, когда вход 13456 то int array[] размер должен быть 5. Что самый быстрый способ сделать это в C++, когда я не знаю, константа размера ?

+1

Есть ли причина, вы не используете зЬй :: вектор? Размеры массива должны быть постоянными времени компиляции. Вы теперь размер во время компиляции или только во время выполнения? –

+0

'int myarr [runtime_value]' является расширением VLA, предпочитаем использовать 'std :: vector' в любом случае. – Jarod42

+0

Я просто хотел узнать, можно ли как-то динамически присваивать размер целого числа с помощью siezof() или что-то подобное? Я знаю, что есть std :: vector, но я хочу этого избежать. –

ответ

5

Вы не можете создать массив с размером времени выполнения, он должен быть известен во время компиляции. Я бы порекомендовал вместо этого 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); 
} 
+2

Использование журнала (10) для вычисления числа цифр в числе опасно. Рассмотрим очень большие числа и отрицательные числа. Безопаснее просто перебирать цифры, используя div и mod. –

+0

@CoryKramer, что неверно на C99, вам разрешено создавать временные массивы. См. Этот ответ http://stackoverflow.com/questions/737240/cc-array-size-at-run-time-wo-dynamic-allocation-is-allowed – jhilmer

+1

@jhilmer Этот вопрос касается C++, а не C. Время выполнения размерные массивы в C++ доступны только через расширения компилятора, это запрещено стандартом. На самом деле ссылка, которую вы опубликовали, говорит именно об этом. – CoryKramer

0

Вы можете использовать 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 
+0

Это не решает их основной вопрос определения количества цифр. – CoryKramer

1

Дополнительный вариант вы могли бы сделать, чтобы избежать использования массива в целом, обращаясь к цифре номера непосредственно:

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; 
} 

Это позволяет рассматривать ваш номер как массив без фактической инициализации массива. Вы можете даже превратить это в класс и использовать перегрузку оператора для получения фактической семантики массива.

Смежные вопросы