У меня довольно длинная программа, над которой я работаю, и мне трудно удалить элемент из вектора. Я пытался сделать это с очень простым вектором, и у меня та же проблема. Насколько я вижу, я сделал это так же, как все объясняли в вопросах других людей. Вот простой код.
vector<int> vect;
vect.push_back(3);
vect.push_back(2);
cout << vect[1]; // prints '2'
vect.erase(vect.begin()+1);
cout << vect[1] << endl; // prints '2'
Что я делаю неправильно?
Кажется, что приведенный выше код работает, потому что я проверил размер в конце, и он напечатал «1». Настоящий код этого не делает:
size = A[i]->B().size();
cout << "size is " << A[i]->B().size() << endl; // prints 21
A[i]->B().erase(A[i]->B().begin()+size);
cout << "size now " << A[i]->B().size() << endl; // prints 21
Я не вижу, что я сделал по-другому? A — это вектор, в котором хранятся другие векторы. Я хочу удалить последний элемент в векторе B.
После того, как вы удалите свой элемент, размер вашего вектора станет 1 (потому что это было 2 до стирания), по сути, делая ваше выражение vect[1]
приведет к неопределенному поведению, потому что нет элемента с индексом 1
больше Все, что осталось — это один элемент (значение = 3, индекс = 0). Если вы использовали vect.at(1)
вместо vect[1]
было бы бросить std::out_of_range
,
После вашего редактирования:
Помните, если размер N
, затем N
недопустимый индекс для вектора !!! Элементы проиндексированы 0, 1, 2, ... N-1
, Так что, действительно, размер 1
следовательно, единственный действительный индекс 0
Что вы делаете неопределенное поведение. По сути, вы обращаетесь к последнему элементу вектора, находящемуся на данный момент, и случайно обнаруживаете мусор, оставленный здесь. Проблема становится очевидной при использовании at
вместо []
для доступа к элементу, потому что at
имеет встроенную проверку диапазона.
// cout << vect[1] << endl;
cout << vect.at(1) << '\n';
Если вы замените []
от at
как указано выше, вы получите std::out_of_range
исключение, указывающее, что указанный вами индекс недействителен.
Чтобы удалить последний элемент в векторе, вы можете использовать .pop_back()
, Также следует отметить, что добавление целых чисел к итератору — плохая идея. использование vector<int>::iterator
вместо того, чтобы добавить вашу переменную.