C ++ list.erase (это, это) стирает что-то? Где найти хорошие ссылки?

Я имею в виду ситуацию, когда итераторы указывают на один и тот же элемент.

На http://www.cplusplus.com/reference/stl/list/erase/ скажем «Удаляет из списка контейнеров либо один элемент (позиция) или диапазон элементов ([первый, последний)).» а также
«первый Последний
Итераторы, задающие диапазон в контейнере списка для удаления: [first, last). то есть диапазон включает в себя все элементы между первым и последним, включая элемент, на который указывает первый, но не элемент, на который указывает последний «.

Я совершенно не знаю, делаю ли я все неправильно, но для каждой части своего кода я нигде не нахожу нужной информации, и когда я хочу проверить ее самостоятельно, я оказываюсь в ситуации, когда я не знаю, что произошло и после того, как спросить здесь и долго спорить, я нахожу что-то вроде «неопределенного поведения». Так может кто-нибудь помочь мне быстрее, что сейчас?

И я хочу стать лучшим программистом и найти лучший источник, чем cplusplus.com и cppreference.com, потому что они оба отстой, есть что-то лучше? Я схожу с ума каждый день с этим C ++ (но я все еще думаю, что это гораздо лучше для быстрых огромных программ, чем Java или C), пожалуйста, помогите.

0

Решение

Собственное определение диапазонов в стандарте (24.2.1p7, выделено мной):

Большинство алгоритмических шаблонов библиотеки, которые работают со структурами данных, имеют интерфейсы, которые используют диапазоны. спектр это пара итераторов, которые обозначают начало и конец вычисления. Диапазон [i,i) это пустой диапазон; в общем, ассортимент [i,j) относится к элементам в структуре данных, начиная с элемента, на который указывает i и до, но не включая элемент, на который указывает j,

Так предполагая it является действительным итератором в конце или в конце lst, вызов lst.erase(it,it) стирает пустой набор элементов из lst, То есть ничего не делает.

9

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

Я думаю, чтобы лучше ответить на ваш вопрос, вы должны подумать о том, как работают итераторы и почему все передается как [первое, последнее), а не как-то иначе.

Есть два основных правила об итераторах, которые вы должны помнить. Вы всегда можете увеличивать один (то есть первый ++) и два итератора, которые указывают на один и тот же элемент, всегда будут равны. Зная это, вы можете перебрать ЛЮБОЙ диапазон итераторов с помощью логики:

for(; first != last; first++)
{
}

Так что, если первый и последний равны, ничего не произойдет. Поэтому, если вы вызовете list.erase (it, it), ничего не будет стерто.

Чтобы выразить это в более общей форме. Любой диапазон в STL, где first == last, фактически пуст.

2

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