包含要动态分配的向量的动态分配向量

问题描述 投票:0回答:1

我正在学习C ++,在Hackerrank上练习时,我第一次遇到包含向量的向量。 This是要解决的问题。从下面提供的程序中,我想知道:

  1. 像我一样声明所需向量的正确方法吗?
  2. 第27行的语句“ a.resize(i)”是否按我的预期工作?
#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;
}

[程序在接受两次输入后终止。

调试断言失败!表达式:向量下标超出范围

c++ vector visual-c++ dynamic-memory-allocation
1个回答
0
投票

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
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
for(size_t i = 0; i < 100; ++i)
{
 test.push_back(i); // will not allocate new memory
}

您遇到的问题是,您在第一次迭代中将向量的大小调整为可容纳0个元素,然后访问索引为0的元素。其他任何后续索引也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.