Почему при добавлении чисел в вектор выводятся нули?

Рейтинг: 0Ответов: 1Опубликовано: 10.03.2023

Я пишу функцию для переноса цифр разрядов числа в вектор. В функции на 15 строке вводятся числа в начало вектора, но выводятся только нули. Если я напишу push_back(), то всё нормально, кроме того, что вектор задом наперед.

Вот код:

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

vector<int> sum_function(int n ) {
    vector<int> v;
    int number_now = 0, number_previous = 0;
    for (int i = 1; i < 3; i++)
    {
        int degree = pow(10, i);
        number_now = (n % degree - number_previous)/pow(10,i-1); 
        number_previous = number_now;

        v.insert(v.begin(), number_now); //15 строчка
    }
    return v;
 }

int main() {
    vector <int> data;
    data = sum_function(324);
    for (int i = 0; i < 3; i++)
    {
        cout << data[i] << endl;
    }

Ответы

▲ 0Принят

Нормально выводит. Только вместо 3 цифр выводит 2, потому что у вас цикл обрабатывает всего 2 цифры. Т.е. в вектор попадает только 2 и 4.

for (int i = 1; i < 3; i++)  // только 2 цифры
{

И из-за этого, в цикле в main() вы выходите за пределы массива.
Для просто перебора всех элементов массива (вывод на экран) лучше использовать

for(const x : data)
    cout << x << " ";
// или
for(int i=0; i< data.size(); ++i)
    cout << data[i] << " ";

Ещё у вас не самый удачный алгоритм получения цифр. В вашем случае нужно заранее знать разрядность чисел. А можно сделать всё проще:

vector<int> sum_function(int n ) 
{
    vector<int> v; 
    v.reserve(10);  // заранее резервируем место, чтобы не было переаллокаций
    while(n)  // пока число больше нуля
    { 
       int number = n % 10;  // последняя цифра
       n /= 10; // число без последней цифры
       v.push_back(number);
    }   
    reverse( v.begin(), v.end() );
    return v;
 }

На самом деле добавлять элементы в конец вектора и потом один раз вызвать reverse() выгоднее, чем добавлять элементы в начало вектора. Уже на числах из 4 разрядов получается, что вставка в начало сделает 3 копирования шести элементов, а реверс сделает всего 2 свопа. И чем больше разрядов в числе, тем разница будет больше и больше.