Как я могу измерить вектор в классе? c ++ oop проблема - PullRequest
0 голосов
/ 01 марта 2020
#include <iostream>
using namespace std;

class vector{
    private:
        int *arr;
        int n;

    public:
        vector(int a, int n){
            for(int i = 1; i <= n; i ++)
                arr[i] = a;
        }

        vector(){
            for(int i = 1; i <= n; i ++)
                arr[i] = 0;
        }

        void reactualizare_vector(int t, int m){
            n = t;
            for(int i = 1; i <= n; i ++)
                arr[i] = m;
        }

        void afis_vector(){
            for(int i = 1; i <= n; i ++)
                cout << arr[i] << " ";
        }

        void citire_vector(int n){
            for(int i = 1; i <= n; i ++)
                cin >> arr[i];
        }
};

int a, n, t, m;

int main()
{
    cin >> a >> n;

    vector p(a, n);
    p.citire_vector(n);
    p.afis_vector();

    return 0;
}

Входные данные: 2 4 2 1 4 3

Выходные данные: 2 1 4 3 0 0 0 0 1952810132 2543616 1952810096 -594764666 6422492 2002010568 2543616 -1294838125 0 0 2543616 0 0 0 0 -1294838125 6422432 0 6422500 2002070528 -974236977 0 6422508 2002010520 -1 2002121555 0 0 4199136 2543616 0

Как изменить размер вектора, чтобы не отображать, что будет после 2 1 4 3?

1 Ответ

0 голосов
/ 01 марта 2020

Стиль кодирования (именование переменных и т. Д. c) очень важен. Я настоятельно рекомендую изучить их (упомянуто в комментариях выше), но я думаю, что другие люди лучше знают по этому вопросу. Я сам не думаю, что у меня есть хороший стиль кодирования, чтобы дать кому-то полезный совет ... Я просто перейду к тому, что может заставить ваш код работать как минимум.

1) n в вектор класса назначен неправильно. Вы взяли n входные данные как глобальную переменную, но на самом деле они не попадают в класс. Вам нужно присвоить значение наподобие p.n = n;, но поскольку n в векторном классе является приватным, вы можете попробовать написать функцию для этого. Одним из способов может быть изменение инициализатора на что-то вроде

vector(int a, int sz){
    n = sz;
    for(int i = 1; i <= n; i ++)
        arr[i] = a;
}

Однако я думаю, что написание функции изменения размера, как правило, намного лучшая идея.

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

2) Как уже упоминалось выше, вы должны фактически выделить указатель arr. Я понятия не имею, почему вы игнорируете индекс 0 в arr, но если вы хотите, вы можете выделить (n+1) * sizeof(int) байтов памяти для arr на этапе инициализации. Примерно так может работать.

vector(int a, int sz){
    n = sz;
    arr = (int *)(malloc((n+1)*sizeof(int)));
    for(int i = 1; i <= n; i ++)
        arr[i] = a;
}

3) Если вам нужно написать векторный класс, это не имеет значения. Но если вас специально не просят написать этот класс, и у вас есть более важная часть задачи, используйте std :: vector. Даже после применения моих исправлений к вашему коду, std :: vector предлагает гораздо лучшую производительность, целый набор полезных функций, и вы, скорее всего, будете делать ошибки и тратить часы на отладку, если вам придется писать целый векторный класс. Избегайте изобретать велосипед.


По-видимому, все, что написано здесь о распределении памяти, кажется неправильным Я понятия не имел о современном распределении памяти C ++. Пожалуйста, игнорируйте их, и, поскольку я не знаю, как стереть принятый ответ, удалите его, если кто-то может. Извините за устаревшую информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...