Я только что написал следующий код и был очень удивлен, что он не компилируется:
std::deque<int> container;
// filling the container...
for (auto it = container.rbegin(); it != container.rend(); ++it)
if (*it == 5)
{
container.erase(it);
break;
}
Как видите, я хочу удалить последний элемент, соответствующий определенному критерию, если таковой имеется.
Ошибка
нет соответствующей функции для вызова std::deque::erase(std::reverse_iterator...
Сначала я не поверил, что это вызвано обратным итератором, но это действительно так, поскольку замена rbegin
/rend
на begin
/end
решает эту проблему.
Итак, 2 вопроса:
- Почему это не поддерживается? Является ли это просто одной из тех мелочей, которые комитет по C++ забыл включить в стандарт, или для такой перегрузки отсутствует какое-либо обоснование?
- Каков самый элегантный способ сделать то, что я хочу? Я застрял с итерацией по индексу?
m_container
иcontainer
одно и то же? - person zdf   schedule 25.01.2016reverse_iterator::base
указывает туда, где он это делает :( : drdobbs.com/cpp/three-guidelines-for-efficient-iterator/ - person Violet Giraffe   schedule 25.01.2016iterator( rev_it.base() )
, как уже предлагал СергейА. Если вы планируете использовать его вfor
, как в вашем примере, это может не сработать, поскольку стирание сделает недействительными все итераторы. - person zdf   schedule 25.01.2016std::remove_if
. Для таких черных задач циклы иbreak
должны быть пережитком прошлого. - person screwnut   schedule 25.01.2016remove_if
удаляет элементы путем смещения (фактическое количество элементов останется прежним). Я предполагаю, что фактический код должен быть примерно таким:erase( remove_if(...
. - person zdf   schedule 25.01.2016rend()
не может вернуть итератор один перед началом, поскольку ничего подобного нет. Поэтому вместо этого он удерживаетbegin()
и корректирует все свои обращения на 1, чтобы компенсировать это. - person Bo Persson   schedule 25.01.2016remove_if
везде, где это возможно; Я даже сделал обертку, чтобы упростить использование стирания-удаления. - person Violet Giraffe   schedule 25.01.2016<algorithm>
я предлагаю использоватьerase
с результатомfind_if(container.rbegin()...
(даже если это не уменьшит количество строк). - person screwnut   schedule 26.01.2016for
иif
. Кроме того, спасибо за ваш вклад, и давайте покончим с этим, пожалуйста. - person screwnut   schedule 09.12.2020