2016-03-24 3 views
5

Я хочу стереть элементы std :: map от beginIt до endIt. erase Функция возвращает итератор элементу, который следует за последним удаленным элементом. разве это не конец? Почему стирание возвращает итератор?Почему map.erase возвращает итератор?

auto it = m_map.erase(beginIt, endIt); 

ответ

2

Я считаю, что это связано с попыткой унифицировать вызовы функций по стандартным типам контейнеров. Например, в std::vector возвращаемый итератор не совпадает с endIt

+0

Есть ли случай для std :: map где (it! = EndIt)? –

+0

Почему ты так говоришь? 'std :: vector :: erase' возвращает итератор, следующий за последним удаленным элементом, так же, как' std :: map :: erase'. – SergeyA

+1

@SergeyA 'std :: map :: erase (beg, end)' возвращает 'end'. 'std :: vector :: erase (beg, end)' возвращает итератор в элемент 'end', указывающий, а не' end'. –

8

Это полезная функция, которую стандартная библиотека C++ использует для всех своих контейнеров.

Особенно полезно использовать, когда вы удаляете набор элементов, подверженных ограничению, и выполняете итерирование по всему контейнеру. Очевидно, что удаление чего-либо из контейнера делает недействительным итератор, который вы передали. Для возврата следующего итератора кандидата полезно.

+0

Это всегда верно только для функций с одним аргументом и для двух аргументов для некоторых контейнеров. Два аргумента 'erase' на карте не делают недействительными' endIt' –

+0

Это не полезно для удаления штрихов на карте в любом случае. – SergeyA

+3

Это также не полезно, когда вы делаете чашку чая. Но это все равно полезно во многих случаях. – Bathsheba

Смежные вопросы