vector <pair <int, int >> v (размер); показывает 0 как значения при печати - PullRequest
0 голосов
/ 07 ноября 2018

C ++: vector<pair<int,int>>v(size); показывает 0 в качестве значений, когда я пытаюсь распечатать значения, но когда размер вектора не объявлен, он показывает правильный вывод? Почему так? Например:

int x;
cin>>x;
vector<pair<int,int>>v(x); //Size declared.
for(int i=0;i<x;i++){
    int p,q;
    cin>>p>>q;
    v.push_back(make_pair(p,q));
}

Но когда я пытаюсь напечатать значения, он печатает только 0.

I/P->  
3
1 2
3 4
5 6
O/P->
0 0
0 0
0 0

Но когда я не объявляю размер вектора, он печатает вывод безо всякой ошибки, почему это так? то есть

int x;
cin>>x;
vector<pair<int,int>>v; //Size is not declared.
for(int i=0;i<x;i++){
    int p,q;
    cin>>p>>q;
    v.push_back(make_pair(p,q));
}
I/P->  
3
1 2
3 4
5 6
O/P-> 
1 2
3 4
5 6

Показывает правильный вывод. Почему это?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вектор конструктор с int означает, что он создает столько элементов. Это пары нулей. Затем вы отталкиваетесь, и в конце создаются новые элементы. Таким образом, все элементы X * 2.

Я предполагаю, что тогда вы не проверяете размер, а вместо этого перечисляете первые элементы X.

Вы можете исправить либо vector :: reserve (x), либо используя [] вместо нажатия назад. Тогда операция будет больше похожа на доступ к массиву.

Поскольку элементом является пара целых, оба варианта хороши.

Резервирование быстрее, доступ к массиву более общий.

0 голосов
/ 07 ноября 2018

Это потому, что конструктор вектора, принимающий интеграл (он имеет тип size_t), не только обеспечивает достаточный размер, но и создает x объекты по умолчанию. Затем вы добавляете свои новые объекты к этим объектам по умолчанию.

Помните, что термин «размер» в формулировке STL относится к количеству уже вставленных / содержащихся элементов, а общее количество элементов, которое может храниться без перераспределения, называется «емкостью».

Если вы хотите предварительно выделить достаточную емкость без создания новых объектов, вам необходимо использовать reserve:

std::vector<std::pair<int,int>> v;
v.reserve(x);
...