vector::erase не стирает нужный элемент, а стирает последний элемент из вектора

Я работал над изучением С++, но теперь я столкнулся с проблемой, которая меня действительно смущает. Проблема в том, что когда я пытаюсь стереть элемент из вектора, функция стирания не стирает элемент, который я хотел стереть, а вместо этого стирает последний элемент из вектора. Я воссоздал проблему с этим фрагментом кода, чтобы было легче понять мою проблему, чем со всем моим кодом:

#include <vector>
#include <iostream>

int main()
{
     std::vector<int> c;
     for(int i=0; i<=10; i++){
         c.push_back(i);
     }

    for (int i=0;i<c.size();i++) {
        std::cout << i << " ";
    }
    std::cout << '\n';

    c.erase(c.begin()+2);

    for (int i=0;i<c.size();i++) {
        std::cout << i << " ";
    }
    std::cout << '\n';

    c.erase(c.begin()+2, c.begin()+5);

    for (int i=0;i<c.size();i++) {
        std::cout << i << " ";
   }
    std::cout << '\n';

}

результат не тот, что ожидается:

0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6

когда я думал, что результат будет

0 1 2 3 4 5 6 7 8 9 10
0 1 3 4 5 6 7 8 9 10
0 1 2 7 8 9 10

Я делаю что-то совершенно неправильно, или почему это не работает, как я думал? Если это актуально, я использую компилятор MinGW для Windows.


person Tuotau    schedule 19.10.2014    source источник


Ответы (3)


После удаления вы не печатаете содержимое вектора, а только переменную цикла.

Просто замените разделы cout на

for (int i=0;i<c.size();i++) {
    std::cout << c[i] << " ";
   }

и он будет работать так, как хотелось бы.

person davidhigh    schedule 19.10.2014
comment
Хм, я не допустил такой же ошибки в своем фактическом коде. Должен ли я отредактировать вопрос, чтобы включить проблемную часть из моего фактического кода, или спросить еще раз? Извините, что усложняю.. - person Tuotau; 20.10.2014
comment
Что касается вашего вопроса, я знаю только эту компиляцию, что звучит разумно для меня. Вслед за ним следует задать новый вопрос. - person davidhigh; 20.10.2014
comment
@Tuotau всегда публикует свой фактический код. См. здесь рекомендации по публикации кода - person M.M; 20.10.2014
comment
@MattMcNabb Я пытался следовать минимальному руководству, но на самом деле сделал еще одну ошибку, так что мне не удалось воссоздать проблему, с которой я столкнулся изначально. Но моя вина за то, что я не был достаточно осторожен. - person Tuotau; 20.10.2014
comment
@Tuotau попробуйте еще раз без ошибки :) (кстати, я предполагаю, что в реальном коде вы действительно используете один и тот же итератор до и после операции стирания?) - person M.M; 20.10.2014

Вы печатаете переменную цикла вместо содержимого вектора. Для всех случаев:

Изменять

for (int i=0;i<c.size();i++) {
    std::cout << i << " ";
}

to

for (int i=0;i<c.size();i++) {
    std::cout << c.at(i) << " ";
}
person tillaert    schedule 19.10.2014

for (int i=0;i<c.size();i++) {
    std::cout << i << " ";
}

должно быть:

for (int i=0;i<c.size();i++) {
    std::cout << c[i] << " ";
}

РЕДАКТИРОВАТЬ: я опоздал.

person Reborn    schedule 19.10.2014