Я прошу пользователя ввести размер и массив, но когда я печатаю вектор, он показывает ‘0’ только как выходной

#c #c 11 #gcc #vector

#c #вектор #цикл while

Вопрос:

Я объявил вектор и пытаюсь указать размер и значения и распечатать его

 #include<iostream>
#include<vector>
using namespace std;
int main()
{
    int s;          
    cin>>s;                   //taking size of vector
    vector <int> arr(s);
    int input;
    while (cin >> input)
       {arr.push_back(input);}     //inserting the values in array
    for(int i=0;i<s;i  )
        cout<<" "<<arr[i];         //printing the values
}
  

Мой ввод
5

1 2 3 4 5

Ожидаемый результат

1 2 3 4 5

Текущий вывод 0 0 0 0 0

Комментарии:

1. Потому что у вас есть 10 элементов и печатаете первые 5.

2. @cdhowie это была маленькая буква «i» в реальном коде, которую я случайно поместил здесь.

3. @Suthiro Размер вектора будет введен пользователем

Ответ №1:

Эта строка:

 vector <int> arr(s);
  

делает arr размер s . В нем будут s элементы, которые по умолчанию инициализированы равными 0. Затем вы выполняете push_back работу с этим вектором, который добавляет дополнительные элементы в вектор.

Когда вы распечатываете первые s элементы, вы видите не значения, которые были считаны cin , а s количество начальных значений, созданных в объявлении arr .

Чтобы исправить это, либо не указывайте размер при объявлении arr , либо просто используйте arr[i] = input; вместо push_back() в цикле.

Ответ №2:

Ваше заявление о создании вектора не просто создало его, оно заполнило его 5 значениями по умолчанию. Для целых чисел значение по умолчанию равно 0.

 vector <int> arr(s);
  

Просто посмотрите на все перегрузки для std::vector конструктора.

Вероятно, вы этого не хотели, вы хотели зарезервировать 5 пробелов в векторе, потому что знали, что собираетесь ввести 5 значений. Вы делаете это с reserve помощью .

 vector <int> arr;
arr.reserve(s);
  

Комментарии:

1. Очень рад видеть ответ на связанный обман вместо последнего вопроса 🙂

2. @cigien спасибо, но все это было случайно. Это закончилось бы последним вопросом, если бы он не был закрыт до того, как я закончил. Я решил, что скопировать его здесь лучше, чем потерять навсегда. И спасибо за идентификацию дубликата, иногда это самая сложная работа.