Как принимать входные данные для массива векторов? - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь решить вопрос, в котором от меня требуется создать массив векторов, просканировать их элементы и получить элемент, заданный двумя числами a и b, описывающими его положение в массиве векторов. Проблема в том, что я не знаю, как правильно сканировать элементы. Всего один вектор занимает все элементы.

-----------------

Если вы хотите, чтобы я дополнительно прояснил проблему, см. Ниже:

Вопрос : https://www.hackerrank.com/challenges/variable-sized-arrays/problem?h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen&h_r=next-challenge&h_v=zen.

Код, который я написал (выдача ошибки сегмента):

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


int main() {
    int n, q;
    cin >> n >> q;
    vector<int> v[n];

    int temp;
    for (int i=0; i<n; i++) {
        while (cin >> temp) {
            v[i].push_back(temp);
            // cout << v[i].size << endl;
            // increase in size would indicate that the element
            // got inserted properly
        }
    }

    int a, b;
    for (int j=0; j<q; j++) {
        cin >> a >> b;
        cout << v[a].at(b) << endl;
    } 

    return 0;
}

Я попытался закомментировать код, чтобы узнать, какая строка неисправна, и вот этот: cout << v[a].at(b) << endl;. Я предполагаю, что это случай доступа к элементам, которые находятся за пределами поля. Это подводит меня к выводу, что элементы не сканируются должным образом. Я думаю, что массив векторов на самом деле содержит только один вектор, в котором есть все элементы. Таким образом, входные данные не входят в число векторов. Он просто попадает в один вектор. Как это исправить?

Я искал похожие вопросы на переполнение стека, и ближайший из них был таким: Создать массив векторов в C ++ . Ответы там обвиняют mallo c в ошибке сегментации, но мой даже не использует mallo c lol, так что в моем случае это явно не виноват. Они также предлагают использовать вектор векторов, что, вероятно, является лучшим решением, но я хочу выяснить, что не так с моим кодом. Кроме того, векторы имеют тенденцию тратить память в виде пустых ячеек, вот и все.

-----------------

Кроме того, почему вызывает ли эта строка ошибку компиляции: // cout << v[i].size << endl;

1 Ответ

1 голос
/ 06 мая 2020

Сначала замечание: vector<int> v[n]; не является стандартным C ++ , потому что поддерживаются только массивы с фиксированным размером во время компиляции, поэтому избегайте этого в производственном коде. Он работает с большинством компиляторов, поэтому я просто замечаю.

Для заполнения ваших векторов вы забыли прочитать размер вектора, который нужно заполнить. 'доступа, убедитесь, что a меньше n и' b 'меньше v[a].size(), прежде чем фактически получить доступ к вектору.

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