динамически распределяемый вектор, содержащий вектор, который должен быть выделен динамически - PullRequest
0 голосов
/ 03 марта 2020

Я изучаю C ++ и во время практики на Hackerrank я впервые столкнулся с векторами, содержащими векторы. Это - это проблема, которую нужно решить. Из приведенной ниже программы я хочу знать:

  1. Это правильный способ объявить требуемый вектор, как я это сделал?
  2. Имеет ли выражение "a.resize (i) "в строке 27 работать так, как я намереваюсь?
#include<iostream>
#include<vector>
#include<array>
bool inrange(int min, int max, int x)
{
    //check if x is in range
    return (x >= min && x <= max);
}

int main(void)
{
    int q{}, n{}; //for no. of queries & no. of elements in array
    std::cin >> q >> n;
    if (inrange(1, 100000, q)) //ensure q to be in specified range
    {
        if (inrange(1, 100000, n))
        {
            //for declaring vector of vectors
            using innertype = std::vector<int>;
            std::vector <innertype> a;
            //array to store no. of elements in each ith array
            std::vector <int> ki;

            for (int i{ 0 }; i < n; ++i)
            {
                //extend vector by one element
>line 27                a.resize(i);
                //get the array for ith position
                int j{ 0 }; char buffer;
                do
                {
                    //extend vector at ith index by one element
                    a[i].resize(j);
                    std::cin >> a[i][j];
                    std::cin >> buffer;
                    ++j;
                } while (buffer != '\n');
                ki.resize(j);
                ki[i] = j;
            }
            //take indexes for query1 and query2 to print requested elements
            int i{}, j{};
            std::cin >> i >> j;
            std::array q1request{ i,j };
            std::cin >> i >> j;
            std::array q2request{ i,j };
            //print elements "a[i][j]"
            std::cout << a[q1request[i]][q1request[j]] << '\n';
            std::cout << a[q1request[i]][q2request[j]];

        }
    }

    return 0;
}

Программа завершает работу после получения двух входных данных.

Ошибка отладки! Выражение: нижний индекс вектора вне диапазона

1 Ответ

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

Нет ничего плохого в том, что вы используете vector, кроме индексации (может быть, немного странно, но не неправильно). Использование метода изменения размера vector неправильно. Для предварительного выделения вектора обычно используются два метода. resize() и reserve().

Один может использоваться в случае, если вам нужно индексировать vector.

std::vector<int> test(10, 0); // creating vector of 10 items set to 0
test.resize(100); // resizing to allocate space for 100 elements
// test.size() == 100
for(size_t i = 0; i < test.size(); ++i)
{
 test[i] = i;
 std::cout << "Filling " << i << "th element." << std::endl;
}

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

std::vector<int> test;
test.reserve(100); // reserve space for at least 100 elements
// test.size() == 0
for(size_t i = 0; i < 100; ++i)
{
 test.push_back(i); // will not allocate new memory
}

Проблема, с которой вы столкнулись, заключается в том, что вы изменяете размер вектора для хранения 0 элементов на первой итерации, а затем получаете доступ к элементу с индексом 0. То же самое будет go для любого другого последующего индекса.

...