#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 спасибо, но все это было случайно. Это закончилось бы последним вопросом, если бы он не был закрыт до того, как я закончил. Я решил, что скопировать его здесь лучше, чем потерять навсегда. И спасибо за идентификацию дубликата, иногда это самая сложная работа.