Почему я не могу удалить элемент в моем векторе?

У меня довольно длинная программа, над которой я работаю, и мне трудно удалить элемент из вектора. Я пытался сделать это с очень простым вектором, и у меня та же проблема. Насколько я вижу, я сделал это так же, как все объясняли в вопросах других людей. Вот простой код.

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

Решение

После того, как вы удалите свой элемент, размер вашего вектора станет 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

5

Другие решения

Что вы делаете неопределенное поведение. По сути, вы обращаетесь к последнему элементу вектора, находящемуся на данный момент, и случайно обнаруживаете мусор, оставленный здесь. Проблема становится очевидной при использовании at вместо [] для доступа к элементу, потому что at имеет встроенную проверку диапазона.

// cout << vect[1] << endl;
cout << vect.at(1) << '\n';

Если вы замените [] от at как указано выше, вы получите std::out_of_range исключение, указывающее, что указанный вами индекс недействителен.

2

Чтобы удалить последний элемент в векторе, вы можете использовать .pop_back(), Также следует отметить, что добавление целых чисел к итератору — плохая идея. использование vector<int>::iterator вместо того, чтобы добавить вашу переменную.

1
По вопросам рекламы [email protected]