Выделение памяти вектора после ее однократного использования? - PullRequest
0 голосов
/ 15 июня 2019

Я делаю цикл n раз, и в каждом цикле я хочу выделить память новому вектору, а после вычислений я хочу освободить память и снова хочу выделить новую в следующем цикле.

C ++ код

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

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;

        vector<int> arr;
        int input;
        int i = 0;
        while ((cin >> input) && (i<n))
            arr.push_back(input), i++;

        for (auto i=arr.begin(), j=arr.begin()+1; i != arr.end()-1, j != arr.end(); i++, j++)
            if (*j < *i)
                cout << *j << " ";
            else
                cout << "-1" << " ";
        cout << "-1" << endl;

        arr.clear(); 
        arr.shrink_to_fit();
    }
    return 0;
}

Ввод

2
5
4 2 1 5 3
6
5 6 2 3 1 7

Ожидаемый вывод

2 1 -1 3 -1
-1 2 -1 1 -1 -1

Объяснение:
Печать следующих ближайших меньших элементов для каждого элемента в массиве, и если не так, то печать -1.

Testcase 1:
Элементами массива являются 4, 2, 1, 5,3. Немедленно меньше 2 - сразу меньше 4, 1 - сразу меньше 2, нет немедленного меньшего 1, 3 - сразу меньше 5, и немедленного меньшего для последнего элемента не существует.Таким образом, вывод: 2 1 -1 3 -1.

Мой вывод

2 1 -1 3 -1
2 -1 1 -1 -1   //error (wrong output)

Когда я не зациклен и сделал это для одиночного тестового примера, это дает желаемый вывод.

Программа для одиночного теста

int main(){
   int n;
   cin>>n;
   vector <int> arr;
   ....
   ....
   ....
  arr.shrink_to_fit();
  return 0;
}

Вход

6
5 6 2 3 1 7

Выход

-1 2 -1 1 -1 -1

Поэтому во время зацикливания должна быть ошибка.

1 Ответ

0 голосов
/ 15 июня 2019

Проблема связана с вашим состоянием в цикле while ((cin >> input) && (i<n)).Вы читаете следующий ввод перед и проверяете, достаточно ли вы прочитали данных.Таким образом, ваш первый вход фактически читает шесть значений

4 2 1 5 3 6

, второй вход читает следующую цифру, 5, как число входов, а затем читает эти пять как

6 2 3 1 7

, чтодаст вам вывод, который вы получаете.

...