2015-07-01 3 views
1

Цикл for в main, который предположим, что pop_back значения только печатают половину значений в массиве. Однако, когда я пишу (i < = пользователь), он печатает все значения.для цикла только для печати половины значений (работа с векторами)

MyVector.h

template<class T> 
T MyVector<T>::Pop_back(){ 
    return elements_ptr[--vectorSize]; 
    } 

main.cpp

int main() 
{ 
    MyVector<int> v1; 
    int user = 500; 

    for(int i= 1; i <= user; i++){ 
     v1.Push_back(i); 
    } 
    cout << v1.size() << endl; // outputs 500 

    for (int j = 0; j < v1.size(); j++){ 
     cout << v1.Pop_back() << " "; 
     if(j % 20 ==0){ 
     cout << endl; 
     } 
    } 

    return 0; 
} 

ответ

5

Проблема здесь:

for (int j = 0; j < v1.size(); j++) { … } 

Как вы по-прежнему поп-элементы с вашего вектора, его сообщили size() является становится все меньше и меньше, а j растет. После того, как вы набрали половину элементов, условие цикла становится ложным.

Решение использовать либо

while (v1.size()) { … } 

или

const int N = v1.size(); 
for (int i = 0; i < N; ++i) { … } 

как вы уже выяснили. Я бы предпочел первый.

+0

damn thanks sir – wazeeer

2

Каждый раз, когда вы звоните pop_back() значение, которое возвращает size() уменьшается на 1.

Так что, если вы начинаете с двумя элементами в векторе и вызвать pop_back() на первой итерации, на второй итерации вы имеете j == 1 и size() == 1, и поэтому петля выходит без обработки второго элемента.

+0

спасибо тонну !! – wazeeer

2

Потому что вы меняете размер вектора (в Pop_back()) внутри цикла for, который используется для конечного состояния цикла. Возможно, вы должны сохранить размер до цикла for.

int v1_size = v1.size(); 
for (int j = 0; j < size; j++) { 
Смежные вопросы