Я имею в виду ситуацию, когда итераторы указывают на один и тот же элемент.
На http://www.cplusplus.com/reference/stl/list/erase/ скажем «Удаляет из списка контейнеров либо один элемент (позиция) или диапазон элементов ([первый, последний)).» а также
«первый Последний
Итераторы, задающие диапазон в контейнере списка для удаления: [first, last). то есть диапазон включает в себя все элементы между первым и последним, включая элемент, на который указывает первый, но не элемент, на который указывает последний «.
Я совершенно не знаю, делаю ли я все неправильно, но для каждой части своего кода я нигде не нахожу нужной информации, и когда я хочу проверить ее самостоятельно, я оказываюсь в ситуации, когда я не знаю, что произошло и после того, как спросить здесь и долго спорить, я нахожу что-то вроде «неопределенного поведения». Так может кто-нибудь помочь мне быстрее, что сейчас?
И я хочу стать лучшим программистом и найти лучший источник, чем cplusplus.com и cppreference.com, потому что они оба отстой, есть что-то лучше? Я схожу с ума каждый день с этим C ++ (но я все еще думаю, что это гораздо лучше для быстрых огромных программ, чем Java или C), пожалуйста, помогите.
Собственное определение диапазонов в стандарте (24.2.1p7, выделено мной):
Большинство алгоритмических шаблонов библиотеки, которые работают со структурами данных, имеют интерфейсы, которые используют диапазоны. спектр это пара итераторов, которые обозначают начало и конец вычисления. Диапазон
[i,i)
это пустой диапазон; в общем, ассортимент[i,j)
относится к элементам в структуре данных, начиная с элемента, на который указываетi
и до, но не включая элемент, на который указываетj
,
Так предполагая it
является действительным итератором в конце или в конце lst
, вызов lst.erase(it,it)
стирает пустой набор элементов из lst
, То есть ничего не делает.
Я думаю, чтобы лучше ответить на ваш вопрос, вы должны подумать о том, как работают итераторы и почему все передается как [первое, последнее), а не как-то иначе.
Есть два основных правила об итераторах, которые вы должны помнить. Вы всегда можете увеличивать один (то есть первый ++) и два итератора, которые указывают на один и тот же элемент, всегда будут равны. Зная это, вы можете перебрать ЛЮБОЙ диапазон итераторов с помощью логики:
for(; first != last; first++)
{
}
Так что, если первый и последний равны, ничего не произойдет. Поэтому, если вы вызовете list.erase (it, it), ничего не будет стерто.
Чтобы выразить это в более общей форме. Любой диапазон в STL, где first == last, фактически пуст.